题意:
有n对情侣坐一桌一起吃饭 一共有1 2两种食物
要求每对情侣吃的东西不能一样 任意相邻的三个人不能吃相同的东西
输入任意一种符合题意的方案
思路:
首先对每对情侣建边
然后
因为任意相邻的三个人不能吃相同的东西
那么我们对两个相邻的点建边
即2*i和2*i-1之间建双向边(+1也没事
建图就这样
然后对图中每一个环按1 2 1 2 1发食物
因为2*i和2*i-1是不一样的 也保证了相邻三个也不一样
最后输出答案
1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 4 using namespace std; 5 typedef long long ll; 6 typedef long double ldb; 7 typedef pair<int,int> pii; 8 9 const int maxn=1e5+10; 10 11 int ans[maxn<<1]; 12 bool vis[maxn<<1]; 13 vector<pii>link; 14 vector<int>edge[maxn<<1]; 15 16 void addedge(int u,int v) 17 { 18 edge[u].push_back(v); 19 edge[v].push_back(u); 20 } 21 22 void solve(int start,int turn) 23 { 24 vis[start]=true; 25 ans[start]=turn; 26 if(turn==1) turn=2; 27 else turn=1; 28 for(auto i:edge[start]) 29 { 30 if(!vis[i]) solve(i,turn); 31 } 32 } 33 34 int main() 35 { 36 int n; 37 scanf("%d",&n); 38 for(int i=1;i<=n;i++) 39 { 40 int x,y; 41 scanf("%d%d",&x,&y); 42 addedge(x,y); 43 addedge(y,x); 44 link.push_back({x,y}); 45 } 46 for(int i=1;i<=n;i++) 47 { 48 addedge(i*2,i*2+1); 49 addedge(i*2+1,i*2); 50 } 51 for(int i=1;i<=2*n;i++) 52 { 53 if(!vis[i]) solve(i,1); 54 } 55 for(auto i:link) 56 { 57 printf("%d %d ",ans[i.first],ans[i.second]); 58 } 59 return 0; 60 }/* 61 62 3 63 1 4 64 2 5 65 3 6 66 67 */