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

    1535 封锁阳光大学
    时间限制: 1 s
    空间限制: 256000 KB
    题目等级 : 钻石 Diamond
    题目描述 Description
    曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。
    阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。
    询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。
    输入描述 Input Description
    第一行:两个整数N,M
    接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。
    输出描述 Output Description
    仅一行:如果河蟹无法封锁所有道路,则输出“Impossible”,否则输出一个整数,表示最少需要多少只河蟹。
    样例输入 Sample Input
    【输入样例1】
    3 3
    1 2
    1 3
    2 3
    【输入样例2】
    3 2
    1 2
    2 3
    样例输出 Sample Output
    【输出样例1】
    Impossible
    【输出样例2】
    1
    数据范围及提示 Data Size & Hint
    【数据规模】
    1<=N<=10000,1<=M<=100000,任意两点之间最多有一条道路。

    /*
    图的m着色问题. 
    一开始以为这是个二部图.
    (这样才不会冲突哈哈哈哈太机智啦)
    然后看出奇数点的环都不行.
    (偶数点可能存在可行方案).
    然后搞二部图搞啊搞啊搞啊搞W0了0.0
    这个图可能是不连通的orz.
    正解从每个点搜索
    对有关系的两点进行着色.
    我们染0 1 两种颜色.
    不用进行两遍 因为是等价的.
    遇到不合理就一定不合理咯.
    */
    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #define MAXN 10001
    using namespace std;
    int n,m,tot[3],s[MAXN],ans;
    bool b[MAXN];
    vector<int>g[MAXN];
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    bool dfs(int u,int p)
    {
        s[u]=p;b[u]=true;tot[p]++;
        for(int i=0;i<g[u].size();i++)
        {
            int v=g[u][i];
            if(b[v]&&s[u]==s[v]) return false;
            if(!b[v])
            {
                if(!dfs(v,p^1)) return false;
            }
        }
        return true;
    }
    int main()
    {
        int x,y;
        n=read(),m=read();
        for(int i=1;i<=m;i++)
        {
            x=read(),y=read();
            g[x].push_back(y),g[y].push_back(x);
        }
        for(int i=1;i<=n;i++)
        {
            if(!b[i])
            {
                tot[1]=tot[0]=0;
                if(!dfs(i,0)){
                    printf("Impossible");return 0;
                }
                ans+=min(tot[1],tot[0]);
            }
        }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070754.html
Copyright © 2011-2022 走看看