9-codeup-最短路径-迪杰斯特拉最短路径算法

160 阅读1分钟

思路

  • 用dijkstra的方法做一下即可。

注意

  • 这个题目的数组下标是从0开始的。

代码

#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=51;
int G[maxn][maxn];
const int INF=0x3fffffff;
int n,s;
int  d[maxn];
bool vis[maxn]={false};

void Dijkstra(int s){
	fill(d,d+maxn,INF);
	d[s]=0;
	for(int k=0;k<n;k++){
		int u=-1,Min=INF;
		for(int i=0;i<n;i++){
			if(vis[i]==false&&d[i]<Min){
				Min=d[i];
				u=i;
			}
		}
		if(u==-1) return;
		vis[u]=true;
		for(int i=0;i<n;i++){
			if(vis[i]==false&&G[u][i]!=INF&&d[u]+G[u][i]<d[i]){
				d[i]=d[u]+G[u][i];
			}
		}
	}
} 
int main(){
	while(scanf("%d%d",&n,&s)!=EOF){
		memset(vis,false,sizeof(vis));
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				int a;
				scanf("%d",&a);
				if(a==0) G[i][j]=INF;
				else G[i][j]=a;
			}
		}
		Dijkstra(s);
		for(int i=0;i<n;i++){
			if(i!=s) {
				if(d[i]!=INF) printf("%d",d[i]);
				else printf("-1");
				if(i!=n-1) printf(" ");
				else printf("\n");
			}
		}
	}
}