2 条题解

  • 1
    @ 2022-08-09 16:06:26

    这道题有两种做法,这里的题解只有扩展域的并查集做法。

    我推荐用二分的方法确定最大暴动事件的影响值,然后染色法判断大于这个值的时间(边)能否构成二分图。

    AC code

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int N=2e5+10;
    int h[N],e[N],ne[N],w[N],idx=0;
    void add(int a,int b,int c)
    {
        e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
        e[idx]=a,w[idx]=c,ne[idx]=h[b],h[b]=idx++;
    }
    
    int n,m;
    
    //染色法判定二分图
    int c[N];
    bool dfs(int u,int color,int limit)
    {
        c[u]=color;
        for(int i=h[u];~i;i=ne[i])
        {
            if(w[i]<=limit) continue;
            int j=e[i];
            if(!c[j]&&!dfs(j,3-color,limit)) return false;
            else if(c[j]==color) return false;
        }
        return true;
    }
    
    bool check(int wall)
    {
        memset(c,0,sizeof c);
        
        for(int i=1;i<=n;i++)
            if(!c[i]&&!dfs(i,1,wall))
                return false;
        return true;
    }
    
    int main()
    {
        memset(h,-1,sizeof h);
        cin>>n>>m;
        while(m--)
        {
            int a,b,c; cin>>a>>b>>c;
            add(a,b,c);
        }
        
        //二分法确定最大暴动事件的数
        int l=0,r=1e9;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
        
        cout<<r;
        return 0;
    }
    
  • 1
    @ 2019-06-06 15:51:41
  • 1

信息

ID
1075
难度
6
分类
图结构 | 二分图 点击显示
标签
递交数
13
已通过
11
通过率
85%
上传者