「SCOI2010」連續攻擊遊戲「並查集」
阿新 • • 發佈:2018-11-11
題解
巧妙的並查集做法。
把每個裝備的兩個屬性 看成邊 ,會形成一些連通塊
如果連通塊大小為 ,無環(樹),答案是 ,有環就是
考慮如何合併兩個連通塊。
合併並查集 ,若 ,把數字小的父親設為數字大的,給數字小的打上 標記。若 ,給樹根打上標記。
這樣維護的並查集有很好的性質:要麼所有 ,要麼除根(最大點)外 。於是最後遍歷一下輸出答案就行了.
#include <cstdio>
const int N = 2e6 + 10;
int n, f[N];
bool vis[N];
int Get(int x) {
return f[x] == x ? x : f[x] = Get(f[x]);
}
void Unite(int x, int y) {
x = Get(x), y = Get(y);
if(x == y) {
vis[x] = 1;
return ;
}
if(x > y) x ^= y ^= x ^= y;
vis[x] = 1;
f[x] = y;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= 10000; i ++) f[i] = i;
for(int i = 1, a, b; i <= n; i ++)
scanf("%d%d", &a, &b), Unite(a, b);
for(int i = 1; i <= 10000; i ++)
if(!vis[i]) return printf("%d\n", i - 1), 0;
printf("10000\n");
return 0;
}