2013 ACM 通化邀请赛D.D

阅读: 评论:0

2013 ACM 通化邀请赛D.D

2013 ACM 通化邀请赛D.D

点击打开链接

D.D-City
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.
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.
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


Sample Output
1
1
1
2
2
2
2
3
4
5


Hint
The 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.

反向其实就是一个并查集的合并操作,。听说正向BFS可破,但是没试过

#include<stdio.h>
#include<string.h>
int dele[100010][2];
int father[10010];
int mystack[100010];
int top;
int count;
int getfather(int i)
{if(father[i] == i)return i;elsereturn  father[i] = getfather(father[i]);
}
void merge(int a, int b)
{a = getfather(a);b = getfather(b);if(a == b)return;else {father[b] = a;count --;}
}
int main()
{int n, m;while(scanf("%d%d", &n, &m) != EOF){int i;memset(dele, 0, sizeof(dele));for(i = 0; i < m; i++)father[i] = i;for(i = 0; i < m ; i++)scanf("%d%d", &dele[i][0], &dele[i][1]);count = n;top = 0;for(i--; i >= 0; i --){mystack[top++] = count;merge(dele[i][0], dele[i][1]);}for(top --; top >= 0; top--){printf("%dn", mystack[top]);}}return 0;
}


本文发布于:2024-02-01 10:18:14,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170675389335932.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:通化   邀请赛   ACM
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23