洛谷1525关押罪犯——二分

题目:https://www.luogu.org/problemnew/show/P1525

二分答案+二分图染色。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int n,m,head[20005],xnt,x,y;
ll ans,l,r,z;
bool vis[20005],col[20005];
struct Node{
    int next,to;
    ll c;
}edge[200005];
void add(int x,int y,ll z)
{
    edge[++xnt].next=head[x];
    edge[xnt].to=y;
    edge[xnt].c=z;
    head[x]=xnt;
}
bool dfs(int a,ll mid)
{
    for(int j=head[a],v;j;j=edge[j].next)
        if(edge[j].c>mid)
        {
            v=edge[j].to;
            if(vis[v]&&col[a]==col[v])return false;
            if(vis[v])continue;
            vis[v]=1;
            col[v]=(col[a]+1)%2;
            if(!dfs(v,mid))return false;
        }
    return true;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%lld",&x,&y,&z);
        add(x,y,z);add(y,x,z);
        r=max(r,z);
    }
    while(l<=r)
    {
        memset(col,0,sizeof col);
        memset(vis,0,sizeof vis);
        ll mid=(l+r)/2;
//        printf("(%lld)
",mid);
        bool flag=0;
        for(int i=1;i<=n;i++)
            if(!vis[i])
            {
                vis[i]=1;col[i]=1;
                if(!dfs(i,mid))
                {
                    flag=1;break;
                }
            }
        if(flag)l=mid+1;
        else ans=mid,r=mid-1;
//        printf("(l=%lld r=%lld)
",l,r);
    }
    printf("%lld",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Zinn/p/8521886.html