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

来源:互联网 发布:博士后出站 知乎 编辑:程序博客网 时间:2024/03/29 01:39

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

代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<string>#include<queue>#include<cmath>#include<cstring>#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 longusing 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;}