【图的最短路之 Dijkstra算法】 最短路径问题

 

                                                         最短路径问题

                                                   Time Limit: 1000 ms                       Memory Limit: 65536 KiB

                                                                             Submit          Statistic

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 
#include 
#include 
#include 
# 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
****************************************************/

 

你可能感兴趣的:(Dijkstra算法)