洛谷 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

posted @ 2019-11-08 22:10  尹昱钦  阅读(209)  评论(0编辑  收藏  举报