题意:n对情侣的位置,坐成环,现在分配食物,满足任意一对情侣间的食物不同,连着三个人的食物不能全相同
题解:每对情侣建边,2*i-1和2*i建边,这样每个点有两条边,所以这个图可以看成由若干个环构成的,对于每个环,可以1-2-1-2的染色
这样对于任意的三个位置,食物肯定不会相同,因为2*i-1和2*i的食物不相同
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>sp[200005];
int a[200005],b[200005],vis[200005],ans[200005];
void add(int a,int b){
sp[a].push_back(b);
sp[b].push_back(a);
}
void gogogo(int t,int col){
vis[t]=1;
ans[t]=col;
col=(col==1?2:1);
for(int i=0;i<sp[t].size();i++){
if(!vis[sp[t][i]])gogogo(sp[t][i],col);
}
}
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
add(a[i],b[i]);
add(2*i-1,2*i);
}
for(i=1;i<=2*n;i++){
if(!vis[i]){
gogogo(i,1);
}
}
for(i=1;i<=n;i++){
printf("%d %d\n",ans[a[i]],ans[b[i]]);
}
return 0;
}