zoukankan      html  css  js  c++  java
  • 封锁阳光大学

    曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。

    阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。

    询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。

    输入输出格式

    输入格式:

    第一行:两个整数N,M

    接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。

    输出格式:

    仅一行:如果河蟹无法封锁所有道路,则输出“Impossible”,否则输出一个整数,表示最少需要多少只河蟹。

    #include<cstdio>
    #include<iostream>
    #include<cstring> 
    #define maxn 200005
    using namespace std;
    int pre[maxn],last[maxn],other[maxn],l;
    int n,m,col[maxn],ans,cnt[3];
    
    void con(int x,int y)
    {
        l++;
        pre[l]=last[x];
        last[x]=l;
        other[l]=y;
    }
    bool dfs(int u)
    {
        for(int p=last[u];p;p=pre[p])
        {
            int v=other[p];
            if(col[v]==0)
            {
                col[v]=3-col[u];
                cnt[col[v]]++;
                if(!dfs(v)) return 0;
            }
            else if(col[v]+col[u]!=3) return 0;
        }
        return 1;
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        con(x,y);
        con(y,x);
    }
        int ans=0;
        for(int i=1;i<=n;i++)
        if(!col[i])
        {
            cnt[1]=cnt[2]=0;
            col[i]=1;
            cnt[1]++;
            if(!dfs(i))
            {
                puts("Impossible");
                return 0;
            }
            ans+=min(cnt[1],cnt[2]);
        }
        cout<<ans;
        return 0;
    }

    #二分图

  • 相关阅读:
    [opentwebst]一个简单的登陆脚本
    opentwebst一个ie自动化操作测试软件-功能强大
    给X9DRL-iF双路服务器主板刷BIOS
    在ubuntu16下面通过kvm+lvm安装ubuntu16的虚拟机
    ubuntu16安装KVM
    PowerShell全自动分配CPU
    在ubuntu16编译安装nginx-1.10.2(full)完全自带组件
    将博客搬至CSDN
    乌邦图ubuntu配置iptables的NAT上网
    LVM增大和减小ext4、xfs分区
  • 原文地址:https://www.cnblogs.com/637w/p/10311071.html
Copyright © 2011-2022 走看看