您的位置:首页 > 其它

并查集优化下-3

2017-03-06 16:07 274 查看
#include<bits/stdc++.h>
using namespace std;
const int N=10000,M=100000;
int f[N+100];
int siz[N+100];
struct nodes
{
int u,v,w;
}node[M+100];
bool cmp(nodes p,nodes q)
{
return p.w>q.w;
}
void init(int n)
{
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=n;i++) siz[i]=1;
}
int Find(int x)
{
if(x==f[x]) return x;
return Find(f[x]);
}
int Union(int x,int y)
{
int tx,ty;
tx=Find(x);
ty=Find(y);
if(tx==ty) return 0;
if(siz[tx]<siz[ty]) {f[tx]=ty;siz[ty]+=tx;}
else {f[ty]=tx;siz[tx]+=ty;}
return 1;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++) scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].w);
sort(node,node+m,cmp);
init(n);
int ans=0,pre=-1;
for(int i=0;i<m;i++)
{
int way=Union(node[i].u,node[i].v);
if(way&&node[i].w!=pre)
{
ans++;
pre=node[i].w;
}
}
printf("%d\n",ans);
return 0;
}

国王的烦恼
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: