继续畅通工程
#include<stdio.h> #include<stdlib.h> #include<algorithm> using namespace std; struct node { int i,j,v,u; }T[10100]; int father[10100],N,M; int cmp(node a,node b) { return a.v<b.v; } int find(int x) { return x==father[x]? x:x=find(father[x]); } void merge(int x,int y) { int a,b; a=find(x),b=find(y); if(a!=b) father[a]=b; } int krusal( ) { int a,i,b,c,sum=0; for(i=0;i<M;i++) { a=T[i].i; b=T[i].j; c=T[i].v; if(find(a)!=find(b)) { sum+=c; merge(a,b); } } return sum; } int main( ) { int i,j,k,a,b,c,d; while(scanf("%d",&N)!=EOF,N) { for(i=1;i<=N;i++) father[i]=i; M=N*(N-1)/2; for(i=0;i<M;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); T[i].i=a; T[i].j=b; if(d==1) T[i].v=0; else T[i].v=c; } sort(T,T+M,cmp); printf("%d\n",krusal()); } return 0; }思路,排序,最小生成树。krusal算法。
posted on 2011-04-30 09:34 more think, more gains 阅读(160) 评论(0) 收藏 举报