继续畅通工程

#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  阅读(152)  评论(0编辑  收藏  举报

导航