HDU - 1325——(並查集)

題意:

判斷是否是一棵有向樹

注意

1:空樹也是樹
2:確定無環
3:最多一棵樹,無森林
4:有向樹,每個結點入度最多爲1

題目鏈接

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
//typedef long long ll;
#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<<flush
#define eps         1e-6
#define base        131
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define pa          pair<int,int>
#define ferma(a,b)  pow(a,b-2)
#define pb          push_back
#define all(x)      x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
    //  freopen("D:/LSNU/codeforces/duipai/AC.txt","w",stdout);
#endif
}
const int N=1e6+5;
int fat[N],vis[N];
int find(int x)
{
    return fat[x]==x?x:fat[x]=find(fat[x]);
}
signed main()
{
    IOS;
    // file();
    int cnt=0,a,b;
    vector<pair<int,int> >vec;
    vector<int>sca;
    while(cin>>a>>b)
    {
        if(a==-1&&b==-1)
            break;
        if(a==0&&b==0)
        {

            sort(all(sca));
            sca.erase(unique(all(sca)),sca.end());
            int flag=1;
            int n=sca.size();
            for(int i=1; i<=n; i++)
                fat[i]=i,vis[i]=0;
            for(auto it:vec)
            {
                int x=lower_bound(all(sca),it.F)-sca.begin()+1;
                int y=lower_bound(all(sca),it.S)-sca.begin()+1;
                int tx=find(x);
                int ty=find(y);
                if(tx!=ty)
                    fat[tx]=ty,vis[y]++;
                else
                {
                    flag=0;
                    break;
                }
                if(vis[y]>1)
                {
                    flag=0;
                    break;
                }
            }
            int sum=0;
            for(int i=1; i<=n; i++)
                if(i==find(i))
                    sum++;
            if(sum>1)
                flag=0;
            vec.clear();
            sca.clear();
            if(flag)
                cout<<"Case "<<++cnt<<" is a tree."<<endl;
            else
                cout<<"Case "<<++cnt<<" is not a tree."<<endl;
            continue;
        }
        vec.pb({a,b});
        sca.pb(a);
        sca.pb(b);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章