CF741C Arpa’s overnight party and Mehrdad’s silent entering

CF741C Arpa’s overnight party and Mehrdad’s silent entering

题目描述

有2n个人围成一圈坐在桌子边上,每个人占据一个位子,对应这2n个人是n对情侣,要求情侣不能吃同一种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物(1或者是2),问一种可行分配方式。

Solution

显然对于第一个要求给情侣连边

然后考虑第二个限制,将其转化成2*i 和 2*i+1不同

二分图染色

#include<bits/stdc++.h>

using namespace std;

inline int read()
{
    int f = 1,x = 0;
    char ch;
    do
    {
        ch = getchar();
        if(ch == '-')f = -1;
    }while(ch<'0'||ch>'9');
    do
    {
        x = (x<<3) + (x<<1) + ch - '0';
        ch = getchar();
    }while(ch>='0'&&ch<='9');
    return f*x;
}

const int MAXN = 200000 + 10;

int n;
int x[MAXN],y[MAXN];
vector<int>g[MAXN];
int col[MAXN];

inline void dfs(int x,int c)
{
    col[x] = c;
    for(int i=0;i<g[x].size();i++)
    {
        int v = g[x][i];
        if(!col[v]) dfs(v,3-c);
    }
}

int main()
{
    n = read();
    for(int i=1;i<=n;i++)
    {
        x[i] = read(),y[i] = read();
        g[x[i]].push_back(y[i]);
        g[y[i]].push_back(x[i]);
    }
    for(int i=1;i<=n;i++)
    {
        g[2*i-1].push_back(2*i);
        g[2*i].push_back(2*i-1);
    }
    for(int i=1;i<=2*n;i++)
    {
        if(!col[i])
        {
            dfs(i,1);
        }
    }
    for(int i=1;i<=n;i++) printf("%d %d\n",col[x[i]],col[y[i]]);
}

 

posted @ 2020-10-15 17:06  wlzs1432  阅读(84)  评论(0编辑  收藏  举报