Description
给定M个二元组(A_i, B_i),求X_1, …, X_N满足:对于任意(A_i, B_i),有|X_{A_i} - X_{B_i}| = 1成立。
Input
第1行,2个整数N、M。
第2行到第M + 1行,2个整数A_i和B_i。
Output
第1行,1个字符串,”YES”表示有解,”NO”表示无解。
第2行,N个整数,X_1, X_2, …, X_N,无解则不输出。
要求|X_i| <= 1,000,000,000,任意一解均可。
Sample Input
输入1:
3 3
1 2
2 3
3 1
输入2:
6 5
1 2
2 3
3 4
4 1
5 6
Sample Output
输出1:
NO
输出2:
YES
0 1 0 1 -99 -100
Data Constraint
对于40%的数据,1 <= N <= 10。
对于100%的数据,1 <= N <= 10,000,0 <= M <= 100,000,1 <= A_i, B_i <= N。
分析
题目给出的a,b其实就是一些约束,
每一个
ai,bi
就是说
ai与bi
相差1。
不难发现,答案序列就仅仅是由1或者0组成的。
所以,约束就可以改变一下,
每一个
ai,bi
就是说
ai与bi
不同。
我们就可以进行染色,
要求
ai与bi
不同。
code(c++)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
using namespace std;
int n,m,x,y;
int f[10003];
bool bz[10003],pd;
int main()
{
freopen("perfect.in","r",stdin);
freopen("perfect.out","w",stdout);
scanf("%d%d",&n,&m);
pd=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if((!bz[x])&&(!bz[y]))
{
bz[x]=bz[y]=1;
f[x]=0;
f[y]=1;
}
if((bz[x])&&(!bz[y]))
{
bz[y]=1;
f[y]=!f[x];
}
if((!bz[x])&&(bz[y]))
{
bz[x]=1;
f[x]=!f[y];
}
if((bz[x])&&(bz[y])&&(f[x]==f[y]))
{
pd=0;
break;
}
}
if(pd)
{
printf("YES\n");
for(int i=1;i<=n;i++)
printf("%d ",f[i]);
}else printf("NO\n");
}