CodeForces 741C Arpa’s overnight party and Mehrdad’s silent entering

题意:

有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 */
原文地址:https://www.cnblogs.com/general10/p/7196717.html