#include<stdio.h> #include<string.h> #define N 100+5 #define MAX 9999 int map[N][N]; int d[N]; int n,ans; void prim(){ int i,j,k,min; for(i=1;i<=n;i++) d[i]=map[1][i]; ans+=d[1]; d[1]=0;//进入最小生成树 for(i=1;i<=n;i++){ min=MAX; for(j=1;j<=n;j++){ if(min>d[j]&&d[j]!=0){ k=j; min=d[j]; } } ans+=d[k]; d[k]=0;//进入最小生成树 for(j=1;j<=n;j++){ if(d[j]>map[k][j]&&d[j]!=0){ d[j]=map[k][j]; } } } return ; } int main(){ int i,j,t; int t1,t2,val; while(scanf("%d",&n)==1,n){ t=n*(n-1)/2; memset(map,MAX,sizeof(map)); memset(d,MAX,sizeof(d)); for(i=1;i<=n;i++)map[i][i]=0; for(i=0;i<t;i++){ scanf("%d%d%d",&t1,&t2,&val); if(map[t1][t2]>val) map[t1][t2]=map[t2][t1]=val; } ans=0; prim(); printf("%d\n",ans); } return 0; }
简单的prim
我都能一遍AC 。。。oh yeah!