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 }