Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)

题目链接:http://codeforces.com/contest/742/problem/E

题意:

有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜。

现在让你输出一种方案,满足以下要求:

  1. 情侣间吃不同的菜

  2. 相邻的三个人不能都吃同一种菜

输出任意一个解:

先将相邻的两个人连边,这样就满足了3个人不吃同样一种菜。

情侣间连边。

图中就不存在奇数环。

那么就一定存在解。然后DFS染色就OK 了。

 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
",color[b[i]],color[g[i]]);
60     }
61     return 0;
62 }
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/6568376.html