BZOJ 1116 [POI2008]CLO

不一定要一颗树 连通块是树就行 
但树根没有入度 说明至少还要有一条没出现过的边连接各连通块内的点 故一个连通块边数大于等于其点数时就满足条件

 

注意:1.不是非按佚合并不可

        2.其实不用存边,边读入边处理即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=2e5+5;
struct P{
    int x,y;
}e[M];
int f[N],flag[N];
int find(int x){
    int now=x,t;
    while(x!=f[x])x=f[x];
    while(now!=x){
        t=f[now];
        f[now]=x;
        now=t;
    }
    return x;
}

/*void unio(int x,int y){
    int fx=find(x),fy=find(y);
    if(rank[fx]<rank[fy])f[fx]=fy;
    else{
        if(rank[fx]==rank[fy]) rank[fx]++;
        f[fy]=fx;
    }
}*/
int main(){
    int n,m,ans=0;
    cin>>n>>m;
    for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y;
    for(int i=1;i<=n;i++)f[i]=i;
    for(int i=1;i<=m;i++){
        int fx=find(e[i].x),fy=find(e[i].y);
        if(fx==fy)flag[fx]=1;
        else{
            if(flag[fx])f[fy]=fx;
            else f[fx]=fy;
        }
    }
    for(int i=1;i<=n;i++)
     if(find(i)==i&&!flag[i])ans=1;
     cout<<(ans?"NIE":"TAK");
     return 0;
}

 

 

 

 

posted @ 2020-01-22 14:39  谨川  阅读(127)  评论(0编辑  收藏  举报