BZOJ1854 [Scoi2010]游戏

来源:互联网 发布:计算机病毒预防软件 编辑:程序博客网 时间:2024/05/18 00:33

题意:中文题,懒得写题意

分析:

神题,神做法。

想了半天不会,只能无耻地搜题解了。

这道题是用并查集来做。

将武器看成边,连接两个属性值,如果一个连通块是一颗树,那么肯定有一个属性值不能得到,如果一个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;}

1 0
原创粉丝点击