ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[LGOJ]P1330 封锁阳光大学[图的黑白染色, dfs]

2019-02-16 15:44:44  阅读:295  来源: 互联网

标签:封锁 ch int LGOJ 黑白 dfs while 染色 P1330


可以发现选了一个点后(染黑),他连着的点全都不能选了(染白). 又要求封锁所有道路,所以转化成图的黑白染色问题来做.

#include<cstdio>
#define re register
inline int read()
{
    int s=0,b=1;
    char ch;
    do{
        ch=getchar();
        if(ch=='-') b=-1;
    }while(ch<'0' || ch>'9');
    while(ch>='0' && ch<='9')
    {
        s=s*10+ch-'0';
        ch=getchar();
    }
    return b*s;
}
struct edge{
    int t,w,next;
}e[110000];
int head[11000],cnt=0,n,m;
inline void add(int f,int t,int w)
{
    ++cnt;
    e[cnt].t=t;
    e[cnt].w=w;
    e[cnt].next=head[f];
    head[f]=cnt;
}
int b[11000],c[11000];
int flag,ans,s;
void dfs(int i,int color)
{
    if(flag) return;
    if(b[i])
    {
        if(c[i]!=color) {flag=233;return;}
        //如果i点已染色, 又将染上一个不同的颜色, 则此联通块不可黑白染色.
        else return;
    }
    ++cnt;
    b[i]=1;
    c[i]=color;
    if(color) ++s;//统计黑点数
    for(re int v=head[i];v;v=e[v].next)
        dfs(e[v].t,!color);//把相邻的点都染成不同的颜色
    //由于只要求出一种染色方案, 不需要回溯.
}
int main()
{
    n=read();
    m=read();
    int x,y;
    for(re int i=1;i<=m;++i)
    {
        x=read();
        y=read();
        add(x,y,1);
        add(y,x,1);
    }
    for(re int i=1;i<=n;++i)
    {//图并不保证联通, 所以要分别染色各个联通块.
        if(b[i]) continue;
        flag=0;
        s=0;//s统计此联通块黑点个数
        cnt=0;//cnt用来统计此联通块节点总数
        dfs(i,1);
        if(flag==233){
            printf("Impossible\n");
            return 0;
        }
        ans+=s<(cnt-s)?s:(cnt-s);
        //既然节点i染黑可行,那么黑白互换也可行.取这两种方案中最小的.
    }
    printf("%d\n",ans);
    return 0;
}

标签:封锁,ch,int,LGOJ,黑白,dfs,while,染色,P1330
来源: https://www.cnblogs.com/cgazn/p/10387920.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有