思路:先找出最短的一個點,也就是起點,從起點出發,找最短的邊,同時標記起點為true(代表已經訪問過),訪問過的點就不用再訪問了,依次下去,保證每一次找到的邊都是最短的邊
到最后沒有邊可以更新了就代表結束
看代碼
#include<iostream> #include<cstdio> #include<cstring> #include<stdio.h> #include<string.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> #include<map> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=1e3+10; const int maxk=100+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f int v,e; ll cost[maxn][maxn];//cost[u][v]代表邊(u,v)的權值 ll d[maxn];//從起點出發到該點的最小距離 bool vis[maxn]; void solve(int s) { for(int i=0;i<v;i++) { d[i]=INF; } memset(vis,false,sizeof(vis)); d[s]=0; while(true) { int flag=-1; for(int i=0;i<v;i++) { //在所有點中找尚未使用的最小距離的點 if(!vis[i]&&(flag==-1||d[i]<d[flag])) flag=i; } if(flag==-1) break; vis[flag]=true; for(int i=0;i<v;i++) { d[i]=min(d[i],d[flag]+cost[flag][i]); } } for(int i=0;i<v;i++) cout<<d[i]<<" "; cout<<endl; } int main() { ios::sync_with_stdio(false); cin>>v>>e; for(int i=0;i<v;i++) { for(int j=0;j<v;j++) cost[i][j]=INF; } int a,b,va; for(int i=0;i<e;i++) { cin>>a>>b>>va; cost[a][b]=va; } solve(0); return 0; }