zoukankan      html  css  js  c++  java
  • AcWing257 关押罪犯(二分图)

    题目问的是最小值,我们仔细观察,这个是具有二分性质的

    因此可以先考虑二分最小答案后进行check

    对于check,其实就是个二分图,看能否把所有的怒气值大于答案的分别放在两边,而直接略过怒气值小的边

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+10;
    int h[N],ne[N],e[N],w[N],idx;
    int color[N],n,m;
    void add(int a,int b,int c){
        e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
    }
    int dfs(int u,int c,int x,int fa){
        int i;
        color[u]=c;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
            continue;
            if(w[i]<=x)
            continue;
            if(color[j]){
                if(color[j]==c)
                    return false;
            }
            else if(!color[j]){
                if(!dfs(j,3-c,x,u))
                return false;
            }
        }
        return true;
    }
    bool check(int x){
        int i;
        memset(color,0,sizeof color);
        for(i=1;i<=n;i++){
            if(!color[i]){
                if(!dfs(i,1,x,-1))
                    return false;
            }
        }
        return true;
    }
    int main(){
        memset(h,-1,sizeof h);
        int i;
        cin>>n>>m;
        while(m--){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        int l=0,r=1e9;
        while(l<r){
            int mid=l+r>>1;
            if(check(mid)){
                r=mid;
            }
            else{
                l=mid+1;
            }
        }
        cout<<l<<endl;
    }
    View Code
  • 相关阅读:
    idea从零搭建简单的springboot+Mybatis
    关于监听微服务功能
    final
    mysql数据库分页查询优化
    Mysql中“select ... for update”排他锁(转)
    HashMap(常用)方法个人理解
    5.1 Object类型
    5.3 Date类型
    4.1-4.2 基本类型及引用类型,执行环境及作用域
    20.JSON
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13214318.html
Copyright © 2011-2022 走看看