这里贴两篇自己写的代码
#include<stdio.h> int map[60][60],n,ans; int f() { int min[60],v[60]; int i,max,j,k; for(i=0;i<n;i++) {min[i]=1000000;v[i]=0;} min[0]=0;v[0]=1; for(j=1,k=0;j<n;j++)//这里j从1开始,(先更新,后比较),先令所有的min[i]表示i点到0点的距离,比j从0开始少比较一次 { for(i=0;i<n;i++) if(!v[i]&&map[k][i]<min[i]) min[i]=map[k][i]; for(i=0,max=100000;i<n;i++) if(!v[i]&&min[i]<max) { max=min[i]; k=i; } v[k]=1; ans+=min[k]; } return ans; } int main() { int i,j; while(~scanf("%d",&n)) { for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); ans=0; printf("%d\n",f()); } }
#include<stdio.h> int map[60][60],n,ans; int f() { int min[60],v[60]; int i,max,j,k; for(i=0;i<n;i++) {min[i]=1000000;v[i]=0;} min[0]=0; for(j=0,k=0;j<n;j++)//这里j从0开始,先比较后更新 { for(i=0,max=100000;i<n;i++) if(!v[i]&&min[i]<max) { max=min[i]; k=i; } v[k]=1; ans+=min[k]; for(i=0;i<n;i++) if(!v[i]&&map[k][i]<min[i]) min[i]=map[k][i]; } return ans; } int main() { int i,j; while(~scanf("%d",&n)) { for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); ans=0; printf("%d\n",f()); }
}