//判断图中两种颜色是否可以对每个结点进行着色,每两个点颜色不同
#include <iostream>
#include<cstdio>
#include<cstring>
#define MAX 100
using namespace std;
int v,e;
int g[MAX][MAX];
int color[MAX];
void createGraph()
{
int start,end;
memset(g,0,sizeof(g));
memset(color,0,sizeof(color));
scanf("%d%d",&v,&e);
while(e--)
{
scanf("%d%d",&start,&end);
g[start][end]=1;
g[end][start]=1;
}
}
//用1或者-1来填满节点
bool dfs(int n,int c)
{
color[n]=c;
for(int i=1;i<=v;i++)
{
//在n到i有边的情况下:
if(g[n][i]!=0)
{
//如果n到i点有边,并且邻接点染相同颜色就返回false
if(color[i]==c)
return false;
//如果n到i点有边,但是还未染色,就对i点染色-c
if(color[i]==0 && !dfs(i,-c))
{
return false;
}
}
}
return true;
}
void solve()
{
for(int i=1;i<=v;i++)
{
//遍历每个点,如果还有点没有染色,就对它进行染色
if(color[i]==0)
{
if(!dfs(i,1))
{
printf("NO!\n");
return;
}
}
}
printf("YES!\n");
}
int main()
{
createGraph();
solve();
printf("\n");
printf("每一点的染色情况:\n");
for(int i=1;i<=v;i++)
{
printf("%d\t",color[i]);
}
return 0;
}