BZOJ2079: [Poi2010]Guilds

【传送门:BZOJ2079


简要题意:

  给出一个无向图,每个点可以成为两种状态,也可以保持原状

  求是否能使得每个点都与两个状态相邻(包括自身)


题解:

  直接搞,实际上就是找无边相连的点

  因为如果一个连通块的大小为1,显然不可能使得每个点都与两个状态相邻

  然后,其他的连通块,只需要找出它的任意一棵生成树(肯定是二分图),所以直接黑白染色就可以了

  所以只要找孤立点就可以了


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
bool v[210000];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(v,false,sizeof(v));
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(x!=y) v[x]=v[y]=true;
    }
    for(int i=1;i<=n;i++) if(v[i]==false){printf("NIE\n");return 0;}
    printf("TAK\n");
    return 0;
}
posted @ 2018-03-26 10:37  Star_Feel  阅读(127)  评论(0编辑  收藏  举报