题目描述:
有n对情侣(2n个人)围成一圈坐在桌子边上,每个人占据一个位子,要求情侣不能吃同一
种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物(1或者是2),问一种可行分配方式。
题解:
如果我们能把不能吃同一种食物的人连边,问题就变成二分图黑白染***r>• 所以情侣关系等价于两者之间连一条边
• “每连续的三个人不能都一样”怎么办?
• 让第2i个人和第2i+1个人不能吃一样的食物即可(即1连2,3连4,5连6以此类推)
• 这样肯定是个二分图——2i和2i-1分别连了他两的情侣,情侣又分别连他两的一个邻居……
每次都是给这个可能存在的环加两个点,所以有环就一定不是奇环

蓝边表示情侣连边,红边表示相邻点对隔一对连一条
基础的二分图问题
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
const int maxn=5e5+9;
vector<int>edge[maxn];
int a[maxn];
int b[maxn];
int col[maxn];
int vis[maxn];
void dfs(int now,int co)
{
vis[now]=1;
col[now]=co;
for(int i:edge[now])
{
if(!vis[i])
{
if(co==1)
dfs(i,2);
else
dfs(i,1);
}
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
edge[a[i]].push_back(b[i]);
edge[b[i]].push_back(a[i]);
}
for(int i=1;i<=n*2;i=i+2)
{
edge[i].push_back(i+1);
edge[i+1].push_back(i);
}
for(int i=1;i<=2*n;i++)
{
if(!vis[i])dfs(i,1);
}
for(int i=1;i<=n;i++)
{
printf("%d %d\n",col[a[i]],col[b[i]]);
}
return 0;
}

京公网安备 11010502036488号