1. 程式人生 > 實用技巧 >Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths (二分圖染色)

Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths (二分圖染色)

  • 題意:有\(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;
    }