思路
注意
代码
#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");
}
}
}
}