zoukankan      html  css  js  c++  java
  • 洛谷P1525关押罪犯——二分做法

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

    二分答案,二分图染色判断是否可行。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,m,ct,head[20005],ans,mx,mid;
    bool col[20005],vis[20005];
    struct N{
        int to,next,w;
    }edge[200005];
    void add(int x,int y,int z)
    {
        ct++;
        edge[ct].to=y;
        edge[ct].next=head[x];
        edge[ct].w=z;
        head[x]=ct;
    }
    bool dfs(int x)
    {
        for(int i=head[x];i;i=edge[i].next)
        {
            int u=edge[i].to;
            if(edge[i].w<=mid)continue;
            if(!vis[u])
            {
                col[u]=!col[x];
                vis[u]=1;
                if(dfs(u))return 1;
            }
            else if(vis[u]&&col[u]==col[x])return 1;
        }
        return 0;
    }
    void per(int l,int r)
    {
        if(l>=r)//=!
        {
            ans=l;
            return;
        }
        memset(col,0,sizeof col);
        memset(vis,0,sizeof vis);
        mid=(l+r)/2;
        bool flag=0;
        for(int i=1;i<=n;i++)
            if(!vis[i])
            {
                vis[i]=1;col[i]=1;
                if(dfs(i))
                {
                    flag=1;
                    break;
                }
            }
        if(flag)per(mid+1,r);
        else per(l,mid);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);add(y,x,z);//无向边 
            mx=max(mx,z);
        }
        per(0,mx);
        printf("%d",ans);
        return 0;
    }
    

      

  • 相关阅读:
    中英切换
    vue-cli3 关闭一直运行的 /sockjs-node/info?t= ...
    vue 深拷贝
    C++ 中 typename
    将博客搬至CSDN
    死锁及处理
    C 运算符优先级
    阻塞与非阻塞,同步与异步
    同步函数与异步函数
    C 结构体位域
  • 原文地址:https://www.cnblogs.com/Zinn/p/8521876.html
Copyright © 2011-2022 走看看