题意:给你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 }
时间: 2024-12-25 20:36:27