https://codeforces.com/contest/1144/problem/F
题目大意:
给定n个点,m条边;
每一条边都连接了两个点。
现在需要我们染色,要求是做到所有有向图不包含长度为2或者更长的路径。
input
6 5
1 5
2 1
1 4
3 1
6 1
output
YES
10100
详解见代码内部注释部分
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1e6,M=4002;
LL n,m;
vector<LL> g[N];
LL col[N],vis[N];
map<LL,PII> mp;
void dfs(LL idx,LL color)
{
for(int i=0;i<g[idx].size();i++)
{
//如果没有染过颜色的
if(vis[g[idx][i]]==0)
{
vis[g[idx][i]]=1;
col[g[idx][i]]=!color;//染一下相反的颜色
dfs(g[idx][i],!color);//继续往下染色
}
}
}
int main()
{
//cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
LL a,b;
cin>>a>>b;
//双向边
g[a].push_back(b);
g[b].push_back(a);
//mp存储第i条边的左边节点和右边节点
mp[i].first=a;
mp[i].second=b;
}
//从1开始染色,经过了1点标注一下
//如果是有向边的起点我们染色为0,否则染色为1
col[1]=0,vis[1]=1;
dfs(1,0);
bool flag=true;
for(int i=1;i<=m;i++)
{
//如果左边右边都染成了一样的颜色,那肯定就是不行的
if(col[mp[i].first]==col[mp[i].second])
{
flag=false;
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
for(int i=1;i<=m;i++)
{
//左边染色为1,右边染色为0,可以染色为0(0向1指向方向)
if(col[mp[i].first]==1&&col[mp[i].second]==0) cout<<"0";
else cout<<"1";
}
}
return 0;
}
- Codeforces Directed Without Round Graphcodeforces directed without round codeforces tokens round graph codeforces 104160j referee without codeforces 1835f graph good codeforces transitive 1900e graph educational codeforces round rated codeforces round 911 div codeforces round 887 div codeforces round 864 div codeforces round 863 div