#include<bits/stdc++.h>
using namespace std;
#define MAX 150
int ans,fa[MAX];
struct TOWN
{
int a,b,c,s;
bool operator<(TOWN t)
{
return c<t.c;
}
}t[MAX*55];
int find(int r)
{
if(r!=fa[r])
{
fa[r]=find(fa[r]);
}
return fa[r];
}
void merge(TOWN &t)
{
int t1=find(t.a);
int t2=find(t.b);
if(t1!=t2)
{
fa[t1]=t2;
ans += t.c;
}
}
int main(void)
{
int n,m;
while(scanf("%d",&n),n)
{
m=n*(n-1)/2;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d %d",&t[i].a,&t[i].b,&t[i].c,&t[i].s);
if(t[i].s==1)
{
t[i].c=0;
}
}
sort(t+1,t+1+m);
for(int i=0;i<=n;i++)
{
fa[i]=i;
}
ans=0;
for(int i=1;i<=m;i++)
{
merge(t[i]);
}
printf("%d\n",ans);
}
return 0;
}
hdoj 1879
本文详细展示了如何使用C++实现并查集数据结构,并应用于求解最小生成树问题。代码中定义了TOWN结构体,通过比较权值进行排序,运用路径压缩和按秩合并优化了并查集操作。程序读取边的权值和标记,对边进行排序后,通过并查集计算最小生成树的总权重。
摘要由CSDN通过智能技术生成