题目链接:http://codeforces.com/problemset/problem/1144/F
题意:给出n个顶点和m条边,找出是否存在有向图使得图中最大长度小于等于2.(可能存在两个或两个以上互不相连的图)
分析:图着色问题:
1.当前节点涂色。
2.下一节点没涂色->dfs下一节点
3.下一节点有颜色->判断下一节点颜色与当前节点是否相同
#include<bits/stdc++.h>
using namespace std;
int fg;
vector<int >mp[200050];///二维数组直接爆了,所以这里折中一下用容器
int a[200050],b[200050],vis[200050];///第一个节点,第二个节点,着色标记
void dfs(int now, int per, int v)///当前节点,上一个节点,着色权值
{
int len = mp[now].size();
vis[now] = v;///当前节点着色
for(int i = 0; i <len;i++)
{
int t = mp[now][i];///下一个节点
if(t==per)continue;///下一个节点与当前节点的上一个节点相同,跳过不予判断
if(vis[t]==-1)dfs(t,now,1-v);///下一个节点未着色,dfs着色
else if(vis[t] == vis[now])fg = false;///当前节点与下一个节点颜色相同,NO
}
return;
}
int main()
{
memset(vis,-1,sizeof(vis));
fg = true;
int n,m;
cin>>n>>m;
for(int i = 1; i <=m;i++)
{
cin>>a[i]>>b[i];
mp[a[i]].push_back(b[i]);
mp[b[i]].push_back(a[i]);
}
dfs(1,-1,0);
if(!fg)cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for(int i = 1; i <=m;i++)
{
if(vis[a[i]]==0)cout<<"1";
else cout<<"0";
}
cout<<endl;
}
return 0;
}