如果能想到一定有解,并且构造出二分图就好做了,情侣之间连边,并且相邻两人连边(这样就满足了相邻三人之间至少两种食物),之后跑一下BFS染色把方案构造出来。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int n;
vector<int> g[maxn];
int x[maxn], y[maxn];
int col[maxn];
void BFS(int s)
{
queue<int> q;
q.push(s);
col[s] = 1;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = 0; i < g[u].size(); i++)
{
int v = g[u][i];
if (col[v] == 0)
{
if (col[u] == 1)
col[v] = 2;
else
col[v] = 1;
q.push(v);
}
}
}
return;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> x[i] >> y[i];
g[x[i]].push_back(y[i]);
g[y[i]].push_back(x[i]);
}
int range = 2 * n - 1;
for (int i = 1; i <= range; i += 2)
{
g[i].push_back(i + 1);
g[i + 1].push_back(i);
}
for (int i = 1; i <= 2 * n; i++)
{
if (col[i] == 0)
BFS(i);
}
for (int i = 1; i <= n; i++)
cout << col[x[i]] << " " << col[y[i]] << "\n";
return 0;
}