您的位置:首页 > 其它

poj 2377最大生成树 Kruskal

2016-07-12 21:34 253 查看
点击打开链接

#include <iostream>
#include <algorithm>
using namespace std;
const int M = 21010;
struct edge{
int u;
int v;
long long cost;
bool operator <(const edge &t)const
{
return cost>t.cost;
}
}e[M];
int n,m,fa[M];
void Inin()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
}
int find(int x)
{
if(x!=fa[x])
{
fa[x]=find(fa[x]); //路径压缩
}
return fa[x];

}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
fa[a]=b;
}
}
void Kruskal()
{
Inin();// union-set 初始化
long long ans=0;
for(int i=0;i<m;i++)
{
if(find(e[i].u)!=find(e[i].v))
{
Union(e[i].u,e[i].v);
ans+=e[i].cost;
n--;
}
if(n==1)
break;
}
if(n==1)
cout<<ans<<endl;
else// 连不通
cout<<-1<<endl;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>e[i].u>>e[i].v>>e[i].cost;
}
sort(e,e+m);
Kruskal();//将n个连通分量变减少至1个(最小生成树)时 所用花费最少
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: