首页 > 代码库 > CodeForces 741C(二分图)

CodeForces 741C(二分图)

CodeForces 741C Arpa’s overnight party and Mehrdad’s silent entering

题意:n对情侣坐在一个圆桌上吃东西,已知他们的位置。有两种菜,要求每对情侣不能吃同一种菜,每相邻的三个人不能吃同一种菜,给出要求下的分配。

思路:对于情侣之间连线,2*i和2*i-1之间连线,两两相连即是两者吃不同的菜,连线方法的后者保证了相邻三个不能相等。这时图中不会包含奇圈(二分图中一定不含奇圈),所以一定能够构成二分图,这时直接dfs处理就好。

技术分享
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
int B[200005];
int G[200005];
int ans[200005];
vector<int> g[200005];
bool dfs(int x){
    for(int i=0;i<g[x].size();i++){
        int v=g[x][i];
        if(ans[v]==ans[x]) return false;
        if(ans[v]==0){
            ans[v]=3-ans[x];
            if(!dfs(v))
                return false;
        }
    }
    return true;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        B[i]=x; G[i]=y;
        g[x].push_back(y);
        g[y].push_back(x);
        g[2*i-1].push_back(2*i);
        g[2*i].push_back(2*i-1);
    }
    memset(ans,0,sizeof(ans));
    for(int i=1;i<=2*n;i++){
        if(!ans[i]){
            ans[i]=1;
            if(!dfs(i)){
                printf("-1\n");
                return 0;
            }
        }
    }
    for(int i=1;i<=n;i++)
        printf("%d %d\n",ans[B[i]],ans[G[i]]);

    return 0;
}
Psong

 

CodeForces 741C(二分图)