Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)
题目链接:http://codeforces.com/contest/742/problem/E
题意:
有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜。
现在让你输出一种方案,满足以下要求:
-
情侣间吃不同的菜
-
相邻的三个人不能都吃同一种菜
输出任意一个解:
先将相邻的两个人连边,这样就满足了3个人不吃同样一种菜。
情侣间连边。
图中就不存在奇数环。
那么就一定存在解。然后DFS染色就OK 了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 2*100010; 6 7 vector <int> G[maxn]; 8 int color[maxn]; 9 int b[maxn]; 10 int g[maxn]; 11 12 bool dfs(int u) 13 { 14 for(int i=0; i<G[u].size(); i++) 15 { 16 int v = G[u][i]; 17 if(color[u]==color[v]) return false; 18 if(!color[v]) 19 { 20 color[v] = 3 - color[u]; 21 if(!dfs(v)) return false; 22 } 23 } 24 return true; 25 } 26 27 int main() 28 { 29 int n; 30 scanf("%d",&n); 31 32 for(int i=1; i<=n; i++) 33 { 34 G[i*2-1].push_back(2*i); 35 G[i*2].push_back(2*i-1); 36 } 37 38 for(int i=0; i<n; i++) 39 { 40 int u,v; 41 scanf("%d%d",&u,&v); 42 G[u].push_back(v); 43 G[v].push_back(u); 44 b[i] = u; 45 g[i] = v; 46 } 47 48 for(int i=1; i<=2*n; i++) 49 { 50 if(color[i]==0) 51 { 52 color[i] = 1; 53 dfs(i); 54 } 55 } 56 57 for(int i=0; i<n; i++) 58 { 59 printf("%d %d\n",color[b[i]],color[g[i]]); 60 } 61 return 0; 62 }