Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths (二分圖染色)
阿新 • • 發佈:2020-11-13
-
題意:有\(n\)個點和\(m\)條無向邊,現在讓你給你這\(m\)條邊賦方向,但是要滿足任意一條邊的路徑都不能大於\(1\),問是否有滿足條件的構造方向,如果有,輸出一個二進位制串,表示所給的邊的方向.
-
題解:我們先單獨拿出\(3\)個點來看,選擇一個點,那麼與它相連的另外兩個點到自己的方向一定是相同的,同理,我們可以推廣到任意一個點,與它相連的所有點到它的方向必須都是一樣的才行,其實到這兒就不難看出可以用二分圖染色來寫了,然後打個板子就能很愉快的AC啦~
-
程式碼:
int n,m; int a,b; vector<int> v[N]; int color[N]; PII edge[N]; bool dfs(int u,int c){ color[u]=c; for(auto w:v[u]){ if(!color[w]){ if(!dfs(w,3-c)) return false; } else{ if(color[w]==c) return false; } } return true; } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>m; rep(i,1,m){ cin>>a>>b; edge[i].fi=a; edge[i].se=b; v[a].pb(b); v[b].pb(a); } bool flag=true; if(!dfs(1,1)){ flag=false; } if(!flag) cout<<"NO\n"; else{ cout<<"YES\n"; rep(i,1,m){ int x=edge[i].fi; int y=edge[i].se; if(color[x]==1 && color[y]==2) cout<<1; else cout<<0; } } return 0; }