Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
Posted is_ok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)相关的知识,希望对你有一定的参考价值。
<题目链接>
题目大意:
给定一个无向图,该无向图不含自环,且无重边。现在要你将这个无向图定向,使得不存在任何一条路径长度大于等于2。然后根输入边的顺序,输出构造的有向图。如果构造的边与输入的方向一致,就输出1,方向不一致就输出0。
解题分析:
因为定向后的图不能存在长度大于等于2的路径,所以我们直接对原图进行奇偶染色。如果碰到了奇环,就直接输出"NO",否则就对该图奇偶染色,进行地定向。$col[u]$表示以$u$为起点的边所染的颜色。
#include <bits/stdc++.h> using namespace std; #define pb push_back const int N = 2e5+5; template<typename T> inline void read(T&x){ x=0;int f=1;char c=getchar(); while(c<‘0‘ || c>‘9‘){ if(c==‘-‘)f=-1;c=getchar(); } while(c>=‘0‘ && c<=‘9‘){ x=x*10+c-‘0‘;c=getchar(); } x*=f; } int n,m; int vis[N],col[N]; vector<int>G[N],index; bool ok=true; void dfs(int u,int cur){ col[u]=cur; vis[u]=1; for(auto v:G[u]){ if(col[v] && col[u]==col[v]) ok=false; //出现冲突 if(!vis[v]){ if(cur&1)dfs(v,2); else dfs(v,1); } } } int main(){ read(n);read(m); for(int i=1;i<=m;i++){ int u,v;read(u);read(v); G[u].pb(v);G[v].pb(u); index.pb(u); //记录下第i条边的起点 } dfs(1,1); if(!ok)return puts("NO"),0; puts("YES"); for(auto u:index){ printf("%d",col[u]-1); }puts(""); }
以上是关于Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 715B:Complete The Graph
[Codeforces 623A] Graph and String
codeforces 623A. Graph and String 构造