題意:ios
有 n 對情侶坐成一個圈,有兩種食物Kooft and Zahre-mar,要給每一個人分其中一種,要求每對情侶的食物不一樣,任意連續的三我的必需要有兩人食物不一樣。spa
求分配方案,無解輸出-1code
1≤n ≤100000ci
注意:「Kooft」 is something make people die. 「Zahre-mar」 meaning is 「Venom of Snake」.get
好開心啊string
構造。it
情侶連邊。爲知足連續三人有兩人不一樣,強制2i和2i+1連邊。io
這樣不會產生奇環,必定有解,二分圖染色class
#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'; }