BZOJ 1116 [POI 2008] 并查集 解题报告
2017-07-06 19:07
405 查看
1116: [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
Sample Output
TAK
上图给出了一种连接方式.
【解题报告】
首先我们可以推出一个性质,当且仅当某一个连通块中没有环存在输出NIE
于是我们可以用并查集把这题水过。。
代码如下:
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
Sample Output
TAK
上图给出了一种连接方式.
【解题报告】
首先我们可以推出一个性质,当且仅当某一个连通块中没有环存在输出NIE
于是我们可以用并查集把这题水过。。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100005 int n,m; int fa ,bel ,w ,d ; int getfa(int x) { return(fa[x]==x)?x:fa[x]=getfa(fa[x]); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) fa[i]=i,d[i]=1; for(int i=1;i<=m;++i) { int x,y; scanf("%d%d",&x,&y); int fx=getfa(x),fy=getfa(y); if(fx!=fy) { fa[fy]=fx; w[fx]+=w[fy]+1; d[fx]+=d[fy]; } else ++w[fx]; } for(int i=1;i<=n;++i) { int x=getfa(i); if(w[x]==d[x]-1) { printf("NIE\n"); return 0; } } printf("TAK\n"); return 0; }
相关文章推荐
- BZOJ 1529 [POI 2005] 并查集 解题报告
- BZOJ 1131 [POI 2008] 解题报告
- [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)
- [BZOJ1040] [ZJOI2008]骑士 解题报告
- [BZOJ2946][Poi2000]公共串解题报告|后缀自动机
- BZOJ 1103 [POI 2007] dfs序+树状数组 解题报告
- BZOJ 1601 [Usaco2008 Oct] 最小生成树 解题报告
- BZOJ 1040 [ZJOI 2008] 树DP 解题报告
- BZOJ 2079 [Poi 2010] 图论 解题报告
- BZOJ大视野 1054: [HAOI2008]移动玩具 解题报告
- BZOJ 3833 [POI 2014] Solar Lamps 解题报告
- BZOJ 2049 [Sdoi 2008] LCT 解题报告
- BZOJ 2792 [POI 2012] 二分答案 解题报告
- BZOJ 4726 [POI 2017] 树DP 解题报告
- BZOJ 2054 并查集 解题报告
- [BZOJ1076][SCOI2008]奖励关解题报告|状压DP
- bzoj 1013: [JSOI2008]球形空间产生器sphere 解题报告
- bzoj 1034: [ZJOI2008]泡泡堂BNB 解题报告
- [BZOJ1010][HNOI2008]玩具装箱toy 解题报告
- BZOJ 3319 并查集 解题报告