P1330 封锁阳光大学

Posted ukcxrtjr

tags:

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

题面:https://www.luogu.org/problem/P1330

本题直接将相邻点染成不同的颜色,遇到染不了的就输出Impossible
然后每次统计染色点数少的加起来就行了.

Code:
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=500005;
int n,m,cnt,head[N],ans,sum0,sum1;
int col[N];
bool flag=true,vis[N];
struct Node{
    int v,nxt;
}edge[N];
void add(int u,int v){
    ++cnt;
    edge[cnt].v=v;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}
void dfs(int u,int fa){
    if(col[u]==0){
        sum0++;
    }
    else{
        sum1++;
    }
    for(int i=head[u];i;i=edge[i].nxt){
        int v=edge[i].v;
        if(v!=fa){
            if(col[v]!=-1){
                flag=false;
                return;
            }
            col[v]=col[u]^1;
            vis[v]=1;
            dfs(v,u);
        }
    }
    return;
}
int main(){
    int u,v;
    scanf("%d%d",&n,&m);
    memset(col,-1,sizeof(col));
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(int i=1;i<=n;i++){
        sum0=sum1=0;
        if(!vis[i]){
            col[i]=1;
            dfs(i,-1);
        }
        if(!flag){
            printf("Impossible
");
            return 0;
        }
        ans+=min(sum0,sum1);
    }
    printf("%d
",ans);
    return 0;
}

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

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

P1330 封锁阳光大学(染色问题)

洛谷——P1330 封锁阳光大学

洛谷 P1330 封锁阳光大学

洛谷 P1330 封锁阳光大学

luogu P1330 封锁阳光大学 x