hdu 4496 并查集 逆向 并查集删边
生活随笔
收集整理的這篇文章主要介紹了
hdu 4496 并查集 逆向 并查集删边
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
貌似某大犇說過 正難則反,,, 題目說要對這張圖進(jìn)行刪邊,然后判斷聯(lián)通塊的個數(shù),那么就可以先把所有邊都刪掉,之后從后往前加邊,若加的邊兩端點(diǎn)不在同一個聯(lián)通塊中, 那么此時聯(lián)通快個數(shù)少一,否則不變 1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4
5 const int maxn = 10000 + 500;
6 const int maxm = 100000 + 5000;
7 int father[maxn];
8 int x1[maxm], x2[maxm];
9 int ans[maxm];
10 int n, m;
11
12
13 int getfather(int x) {
14 if (father[x] == x) return (x);
15 return (father[x] = getfather(father[x]));
16 }
17
18 int main () {
19 while(scanf("%d %d", &n, &m) != EOF) {
20 memset(ans, 0, sizeof(ans));
21 for (int i = 1; i <= n; i++) father[i] = i;
22 for (int i = 1; i <= m; i++) {
23 scanf("%d %d", &x1[i], &x2[i]);
24 x1[i] += 1;
25 x2[i] += 1;
26 }
27 ans[m] = n;
28 for (int i = m; i >= 1; i--) {
29 int tx = getfather(x1[i]);
30 int ty = getfather(x2[i]);
31 if (tx != ty) {
32 ans[i-1] = ans[i] - 1;
33 father[tx] = ty;
34 } else {
35 ans[i-1] = ans[i];
36 }
37 }
38 for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
39 }
40 return 0;
41 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/CtsNevermore/p/5990794.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的hdu 4496 并查集 逆向 并查集删边的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java应用程序中判断用户输入的一个整数
- 下一篇: 第一个极小的机器学习的应用