思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为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; }
原文地址:https://www.cnblogs.com/caijiaming/p/9381476.html
时间: 2024-10-18 19:48:29