• 洛谷P1330 封锁阳光大学(二分图染色)


    P1330 封锁阳光大学

    题目描述

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

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

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

    输入输出格式

    输入格式:

    第一行:两个整数N,M

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    【输入样例1】
    3 3
    1 2
    1 3
    2 3
    
    【输入样例2】
    3 2
    1 2
    2 3
    
    
    输出样例#1:
    【输出样例1】
    Impossible
    
    【输出样例2】
    1
    
    

    说明

    【数据规模】

    1<=N<=10000,1<=M<=100000,任意两点之间最多有一条道路。

    /*
    暴力二分图染色
    我写的dfs 分层染色
    最后统计答案 两种颜色的较小值 
    注意 可能不是连通图 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 100100
    
    using namespace std;
    int n,m,cnt,num,ans;
    int head[maxn],col[maxn],tot[maxn],vis[maxn];
    struct node
    {
        int u,v,next;
    }e[maxn<<1];
    
    inline int init()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    inline void add(int u,int v)
    {
        e[++num].v=v;
        e[num].next=head[u];
        head[u]=num;
    }
    
    bool dfs(int now,int c)
    {
        vis[now]=true;col[now]=c;tot[c]++;
        for(int i=head[now];i;i=e[i].next)
        {
            int v=e[i].v;
            if(vis[v]&&col[v]==col[now]) return false;
            else if(!vis[v])
            {
                bool flag=dfs(v,(c+1)&1); 
                if(!flag) return false;
            }
        }
        return true;
    }
    
    int main()
    {
        int x,y;
        n=init();m=init();
        for(int i=1;i<=m;i++)
        {
            x=init();y=init();
            add(x,y);add(y,x);
        }
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                tot[0]=tot[1]=0;
                int flag=dfs(i,0);
                if(!flag)
                {
                    printf("Impossible
    ");
                    return 0;
                }
                else ans+=min(tot[0],tot[1]);
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    PyQt作品 – PingTester – 多点Ping测试工具
    关于和技术人员交流的一二三
    Pyjamas Python Javascript Compiler, Desktop Widget Set and RIA Web Framework
    Hybrid Qt applications with PySide and Django
    pyjamas build AJAX apps in Python (like Google did for Java)
    PyQt 维基百科,自由的百科全书
    InfoQ:请问为什么仍要选择Java来处理后端的工作?
    Eric+PyQt打造完美的Python集成开发环境
    python select module select method introduce
    GUI Programming with Python: QT Edition
  • 原文地址:https://www.cnblogs.com/L-Memory/p/6574241.html
Copyright © 2020-2023  润新知