题意
给你 n n n个点和 m m m条边,让你给所有的边定向,问是否能使得所有的路径长度都小于 2 2 2。
解题方法
我们发现图是有向的,而且所有的路径长度都要小于2,那么就一定没有任何连续的两条边,那么对于一个点来说,所有的边要么是全都是指向这个点的,要么是从这个点发出的,然后这样就是一个二分图,只要染个色判断一下就好了
代码
```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int head[500010],to[500010],nxt[500020],id[500020],tot=1;
void add(int u,int v,int d)
{
tot++;
nxt[tot]=head[u];
head[u]=tot;
tot[to]=v;
return;
}
int color[200010];
bool vis[200010];
bool flag=1;
void dfs(int now,int c)
{
color[now]=c;
vis[now]=1;
if(!flag)return;
for(int i=head[now];i;i=nxt[i])
{
int p=to[i];
if(!vis[p])
{
color[p]=1-c;
dfs(p,1-c);
}
else
{
if(color[p]==c)
{
flag=0;
return;
}
}
if(c)id[i]=1,id[i^1]=0;
else id[i]=0,id[i^1]=1;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v,i);
add(v,u,i);
}
dfs(1,1);
if(flag==0)
{
puts("NO");
return 0;
}
else
{
puts("YES");
for(int i=2;i<=2*m;i+=2)
cout<<id[i];
}
return 0;
}