最短路径----迪杰斯特拉算法解析

 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