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

Posted feiief

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1330 封锁阳光大学 (二分图染色)相关的知识,希望对你有一定的参考价值。

题目链接

技术图片

 

 

题解:

每一个子连通图,对它进行黑白染色,然后取两种染色中的最小值,然后最后汇总。

 

#include <bits/stdc++.h>
# define LL long long
using namespace std;

const int maxn=10000+10;
const int maxm=100000+10;
int n,m;
int col[maxn];
int sum[2];

struct Edge{
    int to,next;
}e[maxm<<1];
int head[maxn];
int en;

void add(int u, int v){
    e[en].next=head[u];
    e[en].to=v;
    head[u]=en;
    ++en;
}

bool dfs(int u, int color){
    if(col[u]!=-1 && col[u]!=color) return false;
    if(col[u]!=-1 && col[u]==color) return true;
    col[u]=color;
    sum[color]++;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].to;
        if(!dfs(v,1-color)) return false;
    }
    return true;
}

int main(){
    memset(head,-1,sizeof(head));
    memset(col,-1,sizeof(col));
    scanf("%d %d", &n, &m);
    for(int i=1;i<=m;++i){
        int u,v;
        scanf("%d %d", &u, &v);
        add(u,v);
        add(v,u);
    }
    int res=0;
    for(int i=1;i<=n;++i){
        if(col[i]!=-1) continue;
        sum[0]=0;
        sum[1]=0;
        if(!dfs(i,0)){
            printf("Impossible");
            return 0;
        }
        res+=min(sum[0],sum[1]);
    }
    printf("%d", res);
    return 0;
}

 

以上是关于P1330 封锁阳光大学 (二分图染色)的主要内容,如果未能解决你的问题,请参考以下文章

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

luogu P1330 封锁阳光大学

P1330 封锁阳光大学

luogu P1330 封锁阳光大学

Luogu P1330 封锁阳光大学 (黑白染色)

P1330 封锁阳光大学