Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=2e5+5;
int vis[maxn];
int col[maxn];
vector<int> g[maxn];
int a[maxn],b[maxn];
bool flag=true;
void dfs(int x,int c,int fa)
{
col[x]=c;
for(int i=0;i<g[x].size();i++){
if(g[x][i]==fa)
continue;
if(col[g[x][i]]==-1)
dfs(g[x][i],1-c,x);
else if(col[g[x][i]]==col[x]){ //如果有环就已经不行了
flag=false;
}
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>a[i]>>b[i];
g[a[i]].push_back(b[i]);
g[b[i]].push_back(a[i]);
}
flag=true;
memset(col,-1,sizeof(col));
dfs(1,0,-1);
if(flag){
cout<<"YES"<<endl;
for(int i=0;i<m;i++){
if(col[a[i]]==1)
cout<<"0";
else
cout<<"1";
}
}
else
cout<<"NO"<<endl;
}
法2;存图用链式前向星
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
const int inf=0x3f3f3f3f;
int n,m;
int first[maxn],sign;
int vis[maxn];
int a[maxn][2];
struct node
{
int to,w,next;
} edge[maxn<<1];
void init()
{
for(int i = 0; i <=n; i++)
first[i]=-1;
sign=0;
}
void add_edge(int u,int v,int w)
{
edge[sign].to=v;
edge[sign].w=w;
edge[sign].next=first[u];
first[u]=sign++;
}
bool flag1=0;
void dfs(int x,int flag)///对整个图进行染色1 0 1 0...,
{
vis[x]=flag;
for(int i=first[x]; ~i; i=edge[i].next)
{
int to=edge[i].to;
if(vis[to]==vis[x])///判断是是否有环
{
flag1=1;
return ;
}
if(vis[to]==-1)
{
dfs(to,flag^1);
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=1; i<=m; i++)
{
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v,1);
add_edge(v,u,1);
a[i][0]=u;
a[i][1]=v;
}
memset(vis,-1,sizeof(vis));
dfs(1,1);
if(flag1)
puts("NO");///如果图中有环的话,肯定就会存在dist>=2的点,可以自己画一个三角形看看,就很容易理解了
else
{
puts("YES");
for(int i=1; i<=m; i++)
{
if(vis[a[i][0]]==1)///a[i][0]为第i条边的起点,a[i][1]为第i条边的终点。
///这里我们已经将整个图染色,整个图分为两类,标记为1的点和标记为0的点
///以标记为1的点为起点,出发的边不做修改,即边的标记为0
///以标记为0的点为起点,出发的边改为相反的方向,即边的标记为1,
///这里其实是不难理解的,两个相邻的点必定为1 0或者0 1,1->0->1
///(1出发的边保持原来的方向,0出发的边改为相反的方向)或者(0出发
///的边保持原来的方向,1出发的边改为相反的方向)才能使得整个图的不出现长度为2或者更大的路径
printf("0");
else
printf("1");
}
}
return 0;
}