LA3644 利用并查集判断是否有环

这题是并查集的典型应用,判断是否存在环,即两个点的祖先是否相同,这题要求不能有环,要删除的边数。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 100005
#define INF 0xfffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(i,s,t) for(int i=s;i<=t;i++)
#define ull unsigned long long
#define ll long long
using namespace std;
int f[maxn];
int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}
int u,v,ans;
void init()
{
    ans=0;
    for(int i=0; i<=100000; i++)
    {
        f[i]=i;
    }
}
int main()
{
    init();
    while(scanf("%d",&u)==1)
    {
        if(u==-1)
        {
            printf("%d\n",ans);
            init();
        }
        else
        {
            scanf("%d",&v);
            int a=find(u),b=find(v);
            if(a==b)
            {
                ans++;
            }
            else
                f[b]=a;
        }
    }
    return 0;
}


你可能感兴趣的:(数据结构)