zoukankan      html  css  js  c++  java
  • 洛谷 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

  • 相关阅读:
    java学习笔记(4)多态
    scala学习笔记(1)
    java复习(3)继承下
    java复习(3)继承
    java复习(2)
    java中常见的异常种类
    数组的内存结构
    Castle ActiveRecord学习(一)简介
    OAuth2.0 Owin 授权问题
    将对象转为json,加入到HttpResponseMessage中
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/11823603.html
Copyright © 2011-2022 走看看