点击打开链接
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小时内删除。
留言与评论(共有 0 条评论) |