题目描述
输入描述
输出描述
输入样例
3
1 4
2 5
3 6
输出样例
1 2
2 1
1 2
题意
有 n n n 对情侣( 2 n 2n 2n 个人)围成一圈坐在桌子边上,每个人占据一个位置,要求情侣不能吃同一种食物,且桌子上相邻的三个人的食物必须有两个人是不同的,且只有两种食物( 1 o r 2 1or2 1or2 ),构造一种可行分配方式。
二分图问题,将吃不同食物的人分别分到两个集合。由于相邻的三个人不能吃同一种食物,因此考虑相邻食物不同,即偶数吃同一种,奇数吃同一种。且由情侣间不能吃同一种食物,因此情侣间的连线一定为两个集合间的连线,且情侣又分别连向其一个邻座。由于每次都将加入两条边,因此可保证结果一定是偶环。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,a[N],b[N],col[N];
vector<int> v[N];
inline void dfs(int x) {
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
if(col[y])
continue;
col[y]=3-col[x];
dfs(y);
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
a[i]=x,b[i]=y;
}
for(int i=1;i<=2*n;i+=2){
v[i].push_back(i+1);
v[i+1].push_back(i);
}
for(int i=1;i<=2*n;i++)
if(!col[i])
col[i]=1,dfs(i);
for(int i=1;i<=n;i++)
cout<<col[a[i]]<<" "<<col[b[i]]<<endl;
return 0;
}