【BZOJ1116】[POI2008]CLO 并查集
【BZOJ1116】[POI2008]CLO
Description
Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度
Input
第一行输入n m.1 <= n<= 100000,1 <= m <= 200000 下面M行用于描述M条边.
Output
TAK或者NIE 常做POI的同学,应该知道这两个单词的了...
Sample Input
4 5
1 2
2 3
1 3
3 4
1 4
1 2
2 3
1 3
3 4
1 4
Sample Output
TAK
上图给出了一种连接方式.
上图给出了一种连接方式.
题解:题意——无向边不算入度!!
所以在一个连通块内,只要存在环,就一定能使这个连通块内的所有点都有一个入度,否则不能
如果一个连通块内边数≥点数,就说明一定存在环(也可以直接打个标记~)
#include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; const int maxn=100010; int n,m; int f[maxn],sv[maxn],se[maxn]; int find(int x) { return (f[x]==x)?x:(f[x]=find(f[x])); } int main() { scanf("%d%d",&n,&m); int i,j,a,b; for(i=1;i<=n;i++) f[i]=i,sv[i]=1; for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); if(find(a)!=find(b)) { se[f[b]]+=se[f[a]],sv[f[b]]+=sv[f[a]],f[f[a]]=f[b]; } se[f[b]]++; } for(i=1;i<=n;i++) { if(find(i)==i&&sv[i]>se[i]) { printf("NIE"); return 0; } } printf("TAK"); return 0; }
| 欢迎来原网站坐坐! >原文链接<