BZOJ 1116 [POI2008]CLO(并查集)

题意

Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度 (输出Yes或No)
数据范围:2 ≤ n ≤ 100 000, 1 ≤ m ≤ 200 000

思路

首先我们可以推出一个性质,当且仅当某一个连通块中没有环存在输出No
(题面一定要仔细看,看错题意连样例都看不懂)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=200010;
 8 int n,m,fa[N],cnt[N];
 9 int find(int x){
10     if(fa[x]==x)return x;
11     else return fa[x]=find(fa[x]);
12 }
13 int main(){
14     scanf("%d%d",&n,&m);
15     for(int i=1;i<=n;i++){
16         fa[i]=i;
17     }
18     for(int i=1;i<=m;i++){
19         int u,v;
20         scanf("%d%d",&u,&v);
21         int x=find(u);
22         int y=find(v);
23         if(x==y){
24             cnt[x]++;
25         }
26         else{
27             fa[x]=y;
28             cnt[y]+=cnt[x];
29         }
30     }
31     for(int i=1;i<=n;i++){
32         int f=find(i);
33         if(cnt[f]==0){
34             printf("NIE");
35             return 0;
36         }
37     }
38     printf("TAK");
39     return 0;
40 }
原文地址:https://www.cnblogs.com/Xu-daxia/p/9559798.html