• 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
  • 相关阅读:
    Linux下的目录结构
    VM
    代码命名规范
    java环境及配置
    Code::Blocks 使用Cygwin编译加调试
    vscode使用体会
    openwrt编译笔记
    ubuntu20 使用root登录
    程序员如何更好的表达自己的想法- Graphviz:关系图脚本绘制工具-转
    编译codelite心得
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6568376.html
Copyright © 2020-2023  润新知