洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)
传送门
解题思路
很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案。
怎样判断是否在一个监狱中呢?
很显然,就是用种类并查集。
种类并查集的讲解——团伙(很像的一个题)
很裸的一个种类并查集。
当然,也可以用二分+二分图染色来解决。
AC代码
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=20005; 6 const int maxm=100005; 7 int n,m,f[2*maxn]; 8 struct node{ 9 int a,b,c; 10 bool operator <(const node x){ 11 return c>x.c; 12 } 13 }e[maxm]; 14 int find(int x){return f[x]==x?x:f[x]=find(f[x]);} 15 int main() 16 { 17 cin>>n>>m; 18 for(int i=1;i<=2*n;i++){ 19 f[i]=i; 20 } 21 for(int i=1;i<=m;i++){ 22 scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c); 23 } 24 sort(e+1,e+m+1); 25 for(int i=1;i<=m;i++){ 26 int fa=find(e[i].a); 27 int fb=find(e[i].b); 28 if(fa==fb||find(e[i].a+n)==find(e[i].b+n)){ 29 cout<<e[i].c; 30 return 0; 31 } 32 f[fa]=find(n+e[i].b); 33 f[fb]=find(n+e[i].a); 34 } 35 cout<<0; 36 return 0; 37 }
//NOIP2010提高组 t3