【NOIP2016提高A组模拟】完美标号

来源:互联网 发布:四宫格拍照软件是什么 编辑:程序博客网 时间:2024/06/07 06:31

Description

给定M个二元组(A_i, B_i),求X_1, …, X_N满足:对于任意(A_i, B_i),有|X_{A_i} - X_{B_i}| = 1成立。

Solution

上面题设的转换形式就是二元组的ai和bi颜色不相同。
那么直接0、1染色之类的。
直接一个dfs就搞定了。

Code

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define rep(i,a) for(i=first[a];i;i=next[i])using namespace std;const int maxn=100007;int i,j,k,l,t,n,m,ans;int a[maxn],b[maxn],first[maxn*2],last[maxn*2],next[maxn*2],num;int c[maxn];bool bz[maxn],cz;void add(int x,int y){    last[++num]=y,next[num]=first[x],first[x]=num;}void dfs(int x,int y){    int i;    if(bz[x]){        if(y){            if(c[y]==c[x])cz=0;        }        return;    }    bz[x]=1;c[x]=(!c[y]);    rep(i,x){        if(last[i]!=y){            dfs(last[i],x);        }    }}int main(){    scanf("%d%d",&n,&m);    fo(i,1,m){        scanf("%d%d",&k,&l);        add(k,l),add(l,k);    }    fo(i,1,n){        if(!bz[i]){            cz=1;            dfs(i,0);            if(!cz){                printf("NO\n");                return 0;            }        }    }    printf("YES\n");    fo(i,1,n)printf("%d ",c[i]);}
2 0
原创粉丝点击