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;
    }
上一篇:[Codeforces 1005F]Berland and the Shortest Paths(最短路树+dfs)


下一篇:Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths