并查集先把两个端点大于K的所有边加进去,然后在不产生新的环的情况下加入剩下的边,没了。。。。
感觉poi2012比13,14,15的水多了呀。。。
#include <bits/stdc++.h>
using namespace std;
#define N 2100000
int n,m,K,ans;
int a[N],b[N],fa[N];
int find(int x){return x==fa[x] ? x:fa[x]=find(fa[x]);}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=m;i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)
if(a[i]>K&&b[i]>K)
ans++,fa[find(a[i])]=find(b[i]);
for(int i=1;i<=m;i++)
if(a[i]<=K||b[i]<=K)
{
if(find(a[i])!=find(b[i]))
{
ans++;
fa[find(a[i])]=find(b[i]);
}
}
printf("%d\n",m-ans);
return 0;
}
本文介绍了一种使用并查集解决特定图论问题的方法:首先将所有边权重大于K的边加入图中,并确保不会形成环;接着再考虑边权重不大于K的情况,同样避免形成环。最终目的是确定能加入图中的最大边数。
1648

被折叠的 条评论
为什么被折叠?



