HDU4496 D-City并查集逆向推理
来源:互联网 发布:网络装备交易 编辑:程序博客网 时间:2024/06/04 18:52
D-City
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 3035 Accepted Submission(s): 1074
Problem Description
Luxer is a really bad guy. He destroys everything he met.
One day Luxer went to D-city. D-city has N D-points and M D-lines. Each D-line connects exactly two D-points. Luxer will destroy all the D-lines. The mayor of D-city wants to know how many connected blocks of D-city left after Luxer destroying the first K D-lines in the input.
Two points are in the same connected blocks if and only if they connect to each other directly or indirectly.
One day Luxer went to D-city. D-city has N D-points and M D-lines. Each D-line connects exactly two D-points. Luxer will destroy all the D-lines. The mayor of D-city wants to know how many connected blocks of D-city left after Luxer destroying the first K D-lines in the input.
Two points are in the same connected blocks if and only if they connect to each other directly or indirectly.
Input
First line of the input contains two integers N and M.
Then following M lines each containing 2 space-separated integers u and v, which denotes an D-line.
Constraints:
0 < N <= 10000
0 < M <= 100000
0 <= u, v < N.
Then following M lines each containing 2 space-separated integers u and v, which denotes an D-line.
Constraints:
0 < N <= 10000
0 < M <= 100000
0 <= u, v < N.
Output
Output M lines, the ith line is the answer after deleting the first i edges in the input.
Sample Input
5 10 0 1 1 2 1 3 1 4 0 2 2 3 0 4 0 3 3 4 2 4
Sample Output
1 1 1 2 2 2 2 3 4 5HintThe graph given in sample input is a complete graph, that each pair of vertex has an edge connecting them, so there's only 1 connected block at first. The first 3 lines of output are 1s because after deleting the first 3 edges of the graph, all vertexes still connected together. But after deleting the first 4 edges of the graph, vertex 1 will be disconnected with other vertex, and it became an independent connected block. Continue deleting edges the disconnected blocks increased and finally it will became the number of vertex, so the last output should always be N.
Source
2013 ACM-ICPC吉林通化全国邀请赛——题目重现
/*Sample Input5 10 0 1 1 2 1 3 1 4 0 2 2 3 0 4 0 3 3 4 2 4 Sample Output1 1 1 2 2 2 2 3 4 5 并查集逆向推理,把所有的点连接成图题意:给定一个图,不停的删除边,问每删除一条边后有多少个连通块注意最后一次输出的一定为n,即顶点的个数,此时的每个点都是孤立的。从后往前推理,对于输入的m对数据,如果开始不连通,则把他们连通起来,对应的连通块的数量也要减1*/#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;int par[10100];struct data{ int x; int y;} a[100010];int n,m;int ans[100010];void Init(){ memset(ans,0,sizeof(ans)); for(int i = 0; i <= n; i ++) par[i] = i; for(int i = 1; i <= m; i ++) scanf("%d%d",&a[i].x,&a[i].y);}int find(int x){ if(par[x] == x) return x; else return par[x] = find(par[x]);}int main(){ while(~scanf("%d%d",&n,&m)) { Init(); ans[m] = n; ///逆向考虑,所以此处在建图 ///ans数组保存上一步的连通块的个数 for(int i = m; i >= 1; -- i) { int x = find(a[i].x); int y = find(a[i].y); ///说明此时不在一个连通块上面,连接,则上一步的连通块数量减少1 if(x != y) { if(x < y) par[x] = y; else par[y] = x; ans[i-1] = ans[i] - 1; } else ans[i-1] = ans[i]; } for(int i = 1; i <= m; i ++) printf("%d\n",ans[i]); } return 0;}
0 0
- HDU4496 D-City并查集逆向推理
- HDU4496 D-City(并查集逆向思维)
- hdu4496--D.City(并查集)
- HDU4496 D-City【并查集】
- hdu4496 D-City 并查集
- hdu4496 D-City 并查集
- hdu4496 D-City 并查集
- 并查集:HDU4496-D-City(倒用并查集)
- hdu4496(并查集+逆向思维)
- hdu4496 D-City(并查集删边)
- HDU ACM 4496 D-City ->并查集+逆向
- hdu 4496 D-City(并查集逆向思维)
- hdu4496 D-City(反向并查集啊 )
- 并查集HDU4496
- HDU4496(并查集)
- hdu4496 并查集
- hdu4496 D-City
- hdu4496 D-City
- Spring MVC的基础知识
- 【NGUI】UI摄像机和主摄像机。画面有异常情况的处理
- 基于python sqlite3将KDD-99数据集插入数据库中
- JAVA中int、String的类型转换
- memcache 怎么存储的对象
- HDU4496 D-City并查集逆向推理
- java接口可以多继承
- postgresql:could not identify an equality operator for type json
- android 音效处理 (2)
- android开发游记:VectorDrawable矢量图兼容性问题的解决方案
- Radar
- nyoj 517 最小公倍数
- SDUT2132数据结构实验之栈二:一般算术表达式转换成后缀式
- 怎样将win平台QT5.4.1-MingW编译的可执行程序打包给其他电脑使用?