传送门biu~
把每个属性当作一个点,武器是连边。当一个节点数是n的联通块是一棵树时,只有n-1个属性能被满足;当联通快不是一棵树时,所有的属性都能被满足。所以把每个联通快用并查集维护,当联通块是一棵树的时候让块内最大的属性值不能满足。最后暴力查结果就可以了。
#include<bits/stdc++.h>
using namespace std;
int n,father[10005];
bool b[10005];
int search(int x){return father[x]==x ? x : father[x]=search(father[x]);}
int main(){
scanf("%d",&n);
for(int i=1;i<=10001;++i) father[i]=i;
for(int i=1;i<=n;++i){
int x,y;
scanf("%d%d",&x,&y);
int xn=search(x),yn=search(y);
if(xn^yn){
if(xn>yn) swap(xn,yn);
father[xn]=yn;
b[xn]=1;
}
else b[xn]=1;
}
for(int i=1;i<=10001;++i){
if(!b[i]){
printf("%d",i-1);
return 0;
}
}
}