CF741C.Arpa’s overnight party and Mehrdad’s silent entering [构造 二分图染色]

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

题意:

有 n 对情侣坐成一个圈,有两种食物Kooft and Zahre-mar,要给每个人分其中一种,要求每对情侣的食物不同,任意连续的三个人必须要有两人食物不同。

求分配方案,无解输出-1

1≤n ≤100000


注意:“Kooft” is something make people die. “Zahre-mar” meaning is “Venom of Snake”.

好开心啊

构造。

情侣连边。为满足连续三人有两人不同,强制2i和2i+1连边。

这样不会产生奇环,一定有解,二分图染色

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5+5;

int n, a[N], b[N];
struct edge {
    int v, ne;
} e[N<<1];
int cnt, h[N];
inline void ins(int u, int v) {
    e[++cnt] = (edge) {v, h[u]}; h[u] = cnt;
    e[++cnt] = (edge) {u, h[v]}; h[v] = cnt;
}

int col[N];
void dfs(int u, int p) {
    col[u] = p;
    for(int i=h[u]; i; i=e[i].ne) {
        int v = e[i].v;
        if(col[v]) continue;
        dfs(v, 3-p);
    }
}
int main() {
    //freopen("in", "r", stdin);
    ios::sync_with_stdio(false); cin.tie(); cout.tie();
    cin >> n;
    for(int i=1; i<=n; i++) {
        cin >> a[i] >> b[i];
        ins(a[i], b[i]);
        ins(i<<1, i<<1|1);
    }

    for(int i=1; i<=n<<1; i++) if(!col[i]) dfs(i, 1);
    for(int i=1; i<=n; i++) cout << col[a[i]] << ' ' << col[b[i]] << '\n';
}
posted @ 2018-07-17 16:32 Candy? 阅读(...) 评论(...) 编辑 收藏