您的位置:首页 > 其它

hdu 1233 kruskal + 并查集

2017-11-10 23:44 453 查看
//构建的图为无向图
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxe=5000+5;              //最大边数
const int maxv=100+5;           //最大顶点数
int n;          //n为最小生成树中的顶点
struct Edge{
int from,to;
int weight;
};
bool operator<(const Edge&E1,const Edge&E2)
{
return E1.weight<E2.weight;
}
Edge edges[maxe];
int vset[maxv];
int e;          //构成最小生成树所需要的边数
int Getparent(int i)
{
if(i!=vset[i])
vset[i]=Getparent(vset[i]);
return vset[i];
}
void kruskal(int num)           //从num条路径中选取e条路径完成生成树
{
int sum=0;
for(int j=1;j<=num;j++)
{
int p1=Getparent(edges[j].from);
int p2=Getparent(edges[j].to);
if(p1!=p2) {
sum+=edges[j].weight;
vset[p2]=p1;
e--;
}
}
cout<<sum<<endl;
}
int main()
{
while(scanf("%d",&n)==1&&n)
{
e=n-1;
for(int i=1;i<=n;i++)           //使用并查集
vset[i]=i;
int num=(n*(n-1))/2;
for(int i=1;i<=num;i++)
{
int v1,v2,dist;
scanf("%d%d%d",&v1,&v2,&dist);
edges[i].from=v1;
edges[i].to=v2;
edges[i].weight=dist;
}
sort(edges,edges+num+1);
kruskal(num);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息