您的位置:首页 > 其它

克鲁斯卡尔算法模板(并查集完美结合)

2013-04-04 22:47 381 查看
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 10005
using namespace std;
int f
,rank
;
struct node
{
int x,y,val;
}e
;
bool operator<(node a , node b)
{
return a.val<b.val;
}
void init_set()
{
for(int i=0 ; i<=N ; i++)
f[i]=i,rank[i]=0;
}
int find_set(int k)
{
/*if(k!=f[k]) f[k]=find_set(f[k]);
return f[k];*/
return f[k]=k!=f[k]?find_set(f[k]):f[k];

}
void union_set(int x , int y)
{
x=find_set(x);
y=find_set(y);
if(x==y) return ;
else
{
if(rank[x]>rank[y]) f[y]=x;
else if(rank[y]>rank[x]) f[x]=y;
else  rank[x]++,f[y]=x;
}
}
int main()
{
//freopen("1.txt","r",stdin);
int n,i,j,s;
while(scanf("%d",&n))
{
if(n==0) break;
int a,b,c,d;
for(i=0 ; i<n*(n-1)>>1 ; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==1) c=0;
e[i].x=a,e[i].y=b,e[i].val=c;
}
sort(e,e+(n*(n-1)>>1));
init_set();
for(s=j=0 ; j<n*(n-1)>>1 ; j++)
{
a=find_set(e[j].x);
b=find_set(e[j].y);
if(a!=b)
{
union_set(a,b);
s+=e[j].val;
}
}
printf("%d\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: