最短路径+Dijkstra+打印路径

来源:互联网 发布:南通seo招聘 编辑:程序博客网 时间:2024/06/01 09:36

2763--最短路径

Description

魔法师甘道夫家住A城,他收到B城国王的邀请参加一个重要会议,已知A城到B城中间有n-2个城城市,为了尽快达到目的地,甘道夫通过水晶球了解到A城到B城的地图,图上显示了n个城镇之间的连接(仅仅考虑单向的路,即考虑第i个城只考虑与后面城的连接的路)和距离。 
请你编个程序找出最短的路径 

Input

第一行 n 表示从A到B的n个城市 1 表示城A n表示城B 
第二行到第n+1 行 每行 n个数字 
(第i+1行,表示 第i个城市与其他城市之间的连接关系 0 表示不连接 其他数字表示连接的距离 )

Output

第一行 一个数字 最短距离 
第二行 n个用空格间隔的整数 表示所选的线路

Sample Input

70 3 5 0 0 0 00 0 0 7 8 6 00 0 0 0 4 5 00 0 0 0 0 0 40 0 0 0 0 0 70 0 0 0 0 0 60 0 0 0 0 0 0

Sample Output

141 2 4 7
#include <cstdio>#include <cstring>#include <algorithm>const int N = 1100;  const int inf = 99999999;  int cost[N][N],path[N];  int d[N],n,y,a[N];  bool deleted[N];  void Shortest_path(){ for(int i=1;i<=n;i++)    {        d[i]=inf;        deleted[i]=false;    }    d[1]=0;    for(int i=1;i<=n;i++)        if(cost[1][i])        {            d[i]=cost[1][i];        }deleted[1]=true;a[y=0]=1;while(true){int min=inf,x;for(int i=1;i<=n;i++)  if(!deleted[i]&&d[i]<min)  {min=d[i];x=i;}   if(min==inf)   break;//printf("%d\n",x);deleted[x]=true;for(int i=1;i<=n;i++)  if(!deleted[i]&&cost[x][i]){if(d[x]+cost[x][i]<d[i]){d[i]=d[x]+cost[x][i];    a[i]=x;  }}            }printf("%d\n",d[n]);int k=0;path[k]=n;while(path[k]!=1){k++;path[k]=a[path[k-1]];}for(int i=k;i>=0;i--)if(path[i])printf("%d ",path[i]);   }int main() {    int c,i,j;    while(scanf("%d",&n),n)    {memset(cost,0,sizeof(cost));        for( i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&c);if(c>0){cost[i][j]=c;cost[j][i]=c;}}Shortest_path();    }    return 0;}


原创粉丝点击