P1330 封锁阳光大学

Posted $mathcal{Lance1ot}$

tags:

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

两个和谐河蟹不能在同一条边的两端。所以对于每条边。只有一个节点有和谐河蟹

所以说,我们可以将有和谐河蟹的看做一种颜色,或则是状态。没有河蟹看做另一种颜色

这样边变成了二分图染色

所以嗯~(???)

就可以dfs暴力染色,不过要注意。有可能有多个图

#include<iostream> 
#include<cstdio> 
#include<algorithm>
using namespace std;
struct node
{
    int point;
    int nxt;
};//链表
node line[201000];
int head[10100],tail;
void add(int a,int b)
{
    line[++tail].point=b;
    line[tail].nxt=head[a];
    head[a]=tail;
}
int color[10100];//染色
int turn[3]={0,2,1};//颜色转换
int t[3];//每种颜色的使用次数
bool flag=false;
void dfs(int x,int c)
{
    color[x]=c;
    t[c]+=1;
    int need=head[x];
    while(need!=0)
    {
        if(!color[line[need].point])
            dfs(line[need].point,turn[c]);
        if(color[line[need].point]==c||flag)
        {
            flag=true;
            t[1]=-0x7fffffff;
            return ;//返回负无穷
        }
        need=line[need].nxt;
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a,b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(!color[i])
        {
            t[1]=t[2]=0;
            dfs(i,1);
            ans+=min(t[1],t[2]);//挑一个小的加
            if(ans<0)//就是dfs中无法二分图染色
            {
                printf("Impossible");
                return 0;
            }
        }
    }
    printf("%d",ans);
}

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

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

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

洛谷——P1330 封锁阳光大学

洛谷 P1330 封锁阳光大学

洛谷 P1330 封锁阳光大学

luogu P1330 封锁阳光大学 x