1 #include<stdio.h> 2 int map[1005][1005],vis[1005],dis[1005],min,n,m; 3 #define max 0x3f3f3f3f//这里表示无穷大,注意如果调用limits.h里面的INT_MAX,他会把这个当2147483647算; 4 void Dijkstra(int x)//这里用迪杰斯特拉算法做最短路径; 5 { 6 int i,j,v; 7 for(i=1;i<=n;i++) 8 { 9 vis[i]=1; 10 dis[i]=map[x][i];//初始化,是每个元素都未被操作,dis数组存放每个点到输入的x的距离; 11 } 12 13 vis[x]=0; 14 dis[x]=0; 15 for(i=1;i<=n;i++) 16 { 17 min=max; 18 for(j=1;j<=n;j++) 19 { 20 if(vis[j]&&min>dis[j])//这里和最小生成树里面的prim算法差不多,先找到除本身以外最短的点; 21 { 22 min=dis[j]; 23 v=j; 24 } 25 } 26 if(min==max) 27 break;//如果相等就说明和所求点每一个相连,直接跳出; 28 vis[v]=0;//每次找到一个就去掉一个,以免重复找; 29 for(j=1;j<=n;j++) 30 { 31 if(vis[j]&&dis[j]>dis[v]+map[v][j]) 32 { 33 dis[j]=dis[v]+map[v][j];//这里是该算法的精髓所在,就是每次判断该路径是否比之前更新的 34 }//dis数组里该点的路径短 ,如果短就更新数值,保证该点到起始点存放的距离是最短的; 35 } 36 } 37 } 38 39 int main() 40 { 41 int a,b,x,y,i,j; 42 while(scanf("%d %d",&n,&m),n||m) 43 { 44 for(i=1;i<=n;i++) 45 for(j=1;j<=n;j++) 46 { 47 if(i!=j) 48 map[i][j]=max;//初始化,让每个点之间路程为无穷大,下面输入自动更新路程,无穷大就相当于这两点之间断开; 49 } 50 while(m--) 51 { 52 scanf("%d %d",&a,&b); 53 map[a][b]=map[b][a]=1; 54 } 55 scanf("%d %d",&x,&y); 56 Dijkstra(x); 57 if(dis[y]!=max) 58 printf("%d\n",dis[y]-1);//由于我们计算的是路程,这里要求点(商店),所以要减掉1; 59 else 60 printf("No Solution\n"); 61 } 62 return 0; 63 }
最短路径----迪杰斯特拉算法解析
猜你喜欢
转载自www.cnblogs.com/AQhhhh/p/10596617.html
今日推荐
周排行