首页 > 代码库 > kuangbin专题四、最短路练习

kuangbin专题四、最短路练习

技术分享

题意:给你t条路径之间的关系,问你从n点走到1的最短路是多少,Dijkstra写一遍就行

Dijkstra理解:从起点s开始找到与之相连最短的点s‘,标记s‘,再更新s到与s‘相连的点s‘‘的最短距离,再从s‘‘中找到到s的最短的一个,标记,再更新s到与s‘‘相连的点的最短距离,循环往复,总之:就是不断标记最短点,再从该点出发,继续寻找。直到标记所有的点,更新完所有dis[i]。

话很绕,不如看图:

技术分享

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 const int maxn=100005;
 7 int mp[1005][1005];
 8 int dis[1005];
 9 int vis[1005];
10 int t,n;
11 
12 void Dijkstra(int s)
13 {
14     memset(vis,0,sizeof(vis));
15     for(int i=1;i<=n;i++)
16         dis[i]=mp[1][i];  //dis[i]表示1到i的最短路
17     vis[s]=1;
18     int k;
19     for(int i=1;i<=n;i++) //迭代n次
20     {
21         int minn=maxn;
22         for(int j=1;j<=n;j++)
23             if(!vis[j] && dis[j]<minn)  //找到之前标记过,与之相连的所有点中的最短路点
24             {
25                 minn=dis[j];
26                 k=j;
27             }
28         vis[k]=1;
29         for(int j=1;j<=n;j++)
30             if(!vis[j] && dis[j]>mp[k][j]+dis[k]) //检查s是直接到j最短,还是经过k再到j最短
31                 dis[j]=mp[k][j]+dis[k];
32     }
33     return;
34 }
35 int main()
36 {
37     while(cin>>t>>n)
38     {
39         for(int i=1;i<=n;i++)
40             for(int j=1;j<=n;j++)
41                 mp[i][j]=maxn;
42         while(t--)
43         {
44             int a,b,c;
45             cin>>a>>b>>c;
46             if(mp[a][b]>c)
47                 mp[a][b]=mp[b][a]=c;
48         }
49         Dijkstra(1);
50         cout<<dis[n]<<endl;
51     }
52     return 0;
53 }
View Code

 

kuangbin专题四、最短路练习