最短路径问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短距离。
Input
第1行为整数n。
第2行到第n+1行(共n行),每行两个整数x和y,描述了一个点的坐标(以一个空格分隔)。
第n+2行为一个整数m,表示图中连线的个数。
此后的m行,每行描述一条连线,由两个整数i和j组成,表示第1个点和第j个点之间有连线。
最后一行:两个整数s和t,分别表示源点和目标点。
Output
仅1行,一个实数(保留两位小数),表示从s到t的最短路径长度。
Sample Input
5 0 0 2 0 2 2 0 2 3 1 5 1 2 1 3 1 4 2 5 3 5 1 5
Sample Output
3.41
Hint
Dijkstra算法升级应用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
# define INF 9999999.9 //定义为无穷大
double map[101][101];//做标记给每一个点,double 类型的,实际存储每个点的距离
int vj[101];//标记是否已经走过了,
int x[101], y[101];//记录坐标的值
double dist[101];//记录到每个点的路径长度
double pf(int a, int b)
{
return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));//用两点之间的距离公式求得距离
}
void djs(int s, int t, int n)
{
int i, j, k, u;
double min;
for(i = 1;i <= n;i++)
{
dist[i] = map[s][i]; //1 是起点,将1 到其余各点的距离存到 dist 数组中
}
dist[s] = 0.0;
vj[s] = 1; //因为走过 1 了所以要标记一下
for(i = 1;i <= n-1;i++) //进行 n-1 次查找,每次都是遍历全部的节点
{
min = INF;
for(j = 1;j <= n;j++)
{
if(min > dist[j]&&vj[j] == 0)//如果距离比当前 1 到该点的距离大并且该点没有标记过
{
min = dist[j]; //把当前得到的距离存入到min中
u = j; //得到的节点存到 u ;
}
}
vj[u] = 1; //保存 u 节点,做标记;这以上代码是求得一点到各个点的距离
for(k = 1;k <= n;k++) //下面的是计算好了后要把他们加起来,最后求得结果;
{
if(vj[k] == 0&&map[u][k] < INF&&dist[k] > map[u][k] + dist[u]) //更新dist[k]值的大小
{
dist[k] = map[u][k] + dist[u];
}
}
}
printf("%.2lf\n",dist[t]); //输出
}
int main()
{
int n, m, i, a, b, s, t;
double q;
scanf("%d",&n);
memset(map,INF,sizeof(map)); //首先把每一个置为无穷大
memset(vj,0,sizeof(vj));//清0;
for(i = 1;i <= n;i++)
{
map[i][i] = 0.0;//初始化 map 数组,除了自己到自己是0,全部置为无穷大;
}
for(i = 1;i <= n;i++)
{
scanf("%d %d",&x[i], &y[i]);
}
scanf("%d",&m);
while(m--)
{
scanf("%d %d",&a,&b);
q = pf(a,b); //调用两点的距离公式
map[a][b] = map[b][a] = q; //把两点的距离赋给 map
}
scanf("%d %d",&s,&t);
djs(s, t,n);//调用函数
return 0;
}
/***************************************************
User name: jk1707
Result: Accepted
Take time: 0ms
Take Memory: 232KB
Submit time: 2018-08-17 10:39:59
****************************************************/