题意:中文题,懒得写题意
分析:
神题,神做法。
想了半天不会,只能无耻地搜题解了。
这道题是用并查集来做。
将武器看成边,连接两个属性值,如果一个连通块是一颗树,那么肯定有一个属性值不能得到,如果一个x个点的连通块边数>=x,说明这个连通块里所有属性值都能得到。
涉及到连通块,我们可以用并查集来维护。
如果当前武器的两个属性值不在一个集合,我们就将属性值小的所在的集合合并到属性值大的所在的集合,这样,如果一个连通块是一棵树,肯定是树根不能得到。
#include <cstdio>
#include <algorithm>
int n,x,y,f[10005],vis[10005];
int fnd(int x) {return f[x] == x ? x : f[x] = fnd(f[x]);}
int main() {
scanf("%d", &n);
for(int i = 1; i <= 10000; i++) f[i] = i;
for(int i = 1; i <= n; i++) {
scanf("%d%d", &x, &y);
int u = fnd(x), v = fnd(y);
if(u != v) {
if(u > v) std::swap(u, v);
f[u] = v, vis[u] = 1;
} else vis[u] = 1;
}
for(int i = 1; i <= 10001; i++) if(!vis[i]) {printf("%d", i-1); return 0;}
return 0;
}