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?  阅读(290)  评论(0编辑  收藏  举报