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]);
}