码迷,mamicode.com
首页 > 其他好文 > 详细

【P1330】 封锁阳光大学

时间:2018-03-09 20:32:49      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:turn   链表   logs   code   point   阳光   line   颜色   blog   

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

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

这样边变成了二分图染色

所以嗯~(???)

就可以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】 封锁阳光大学

标签:turn   链表   logs   code   point   阳光   line   颜色   blog   

原文地址:https://www.cnblogs.com/Lance1ot/p/8535379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!