标签:
没有理由不对呀
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int cost[110][110]; int mincost[110]; bool used[110]; int sett[110]; int M; int prim() { for(int i=0;i<=M;i++) { mincost[i]=2147483646; used[i]=false; } mincost[1]=0; int res=0; while(true){ int v=-1; for(int i=1;i<=M;i++) printf("%d ",mincost[i]); for(int i=1;i<=M;i++) if(!used[i] && (v==-1||mincost[i]<mincost[v])) v=i; printf("v==%d\n",v); if(v==-1) break; used[v]=true; res+=mincost[v]; for(int i=1;i<=M;i++) { mincost[i] = min(mincost[i],cost[v][i]); } } return res; } int find2(int x) { while(x!=sett[x]) x=sett[x]; return x; } int main() { int N; while(scanf("%d%d",&N,&M)&&N){ int flag=0; for(int i=0;i<=M;i++) sett[i]=i; while(N--){ int a,b,c; scanf("%d%d%d",&a,&b,&c); cost[a][b]=c; int fa = find2(a); int fb = find2(b); if(fa!=fb) sett[fa]=fb; } int coutt=0; for(int i=1;i<=M;i++) if(sett[i]==i) coutt++; if(coutt > 1) flag=1; for(int i=1;i<=M;i++) for(int j=1;j<=M;j++) if(cost[i][j]==0) cost[i][j]= 2147483647; for(int i=1;i<=M;i++){ for(int j=1;j<=M;j++) printf("%d ",cost[i][j]); printf("\n"); } if(flag) printf("?\n"); else printf("%d\n",prim()) ; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/a197p/article/details/47131097