http://acm.hdu.edu.cn/showproblem.php?pid=1879
#include<stdio.h> #define INF 0xfffffff #define N 105 int map[N][N],vis[N],low[N],n; void prim() { int i,j,k,min,sum=0; for(i=1;i<=n;i++) low[i]=map[1][i]; for(i=1;i<=n;i++) { vis[1]=1; min=INF; for(j=1;j<=n;j++) if(!vis[j]&&min>low[j]) { min=low[j]; k=j; } vis[k]=1; if(min!=INF) sum+=min; for(j=1;j<=n;j++) if(low[j]>map[k][j]) low[j]=map[k][j]; } printf("%d\n",sum); } int main(void) { int a,b,c,d,i,j; while(scanf("%d",&n)&&n) { for(i=1;i<=n;i++) { vis[i]=0; for(j=1;j<=n;j++) map[i][j]=INF; } for(i=1;i<=n*(n-1)/2;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(d==1) map[a][b]=map[b][a]=0; else map[a][b]=map[b][a]=c; } prim(); } return 0; }