• DP58 红和蓝


    不会,看的其他博客,感觉解释的挺好的:http://t.csdn.cn/89SbY

    描述

    你拿到了一棵树,请你给每个顶点染成红色或蓝色。

    要求:每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点。

    “周围”的定义:某点周围的点指通过邻边直接连接的点。

    所谓树,即没有自环、重边和回路的无向连通图

    输入描述:

    第一行一个正整数 nn,代表树的顶点个数.。

    接下来的 n-1n−1 行,每行两个正整数 uu 和 vv,代表点 uu 和点 vv 有一条边连接。    (1 \leq u,v \leq n)(1≤u,v≤n)

    保证输入的一定是一棵合法的树。

    输出描述:

    如果可以达成染色的要求,请输出一个长度为 nn 的字符串,第  ii 个字符代表第  ii 个顶点的染色情况,'B' 代表蓝色,'R' 代表红色。(若有多种合法染色的方法,输出任意一种即可)

    否则直接输出-1。

    示例1

    输入:

    4
    1 2
    2 3
    3 4

    复制输出:

    RRBB

    复制说明:

    1为红点,它连接的边有只有一个红点:2

    2为红点,它连接的边有只有一个红点:1

    3为蓝点,它连接的边有只有一个蓝点:4

    4为蓝点,它连接的边有只有一个蓝点:3

    示例2

    输入:

    4
    1 2
    1 3
    1 4

    复制输出:

    -1

    复制说明:

    可以证明,无论怎么染色,都无法满足题目的要求。 
    1. #include <iostream>
    2. #include<string.h>
    3. using namespace std;
    4. int dp[100005];
    5. int idx=0;
    6. int print_color[100005];
    7. //给每条边一个index,,也就是pos
    8. struct edge{
    9. int value;
    10. int next;
    11. }edge[200015];
    12. int head[100005];// 存储树的索引节点
    13. void addedge(int x,int y,int pos)
    14. {
    15. edge[pos].value=y;
    16. edge[pos].next=head[x];
    17. head[x]=pos;
    18. }
    19. int dfs1(int x,int fa)
    20. {
    21. int sub_node=0;
    22. for(int i=head[x];i!=-1;i=edge[i].next)
    23. {
    24. if(edge[i].value==fa)
    25. {
    26. continue;
    27. }
    28. sub_node++;
    29. if(dfs1(edge[i].value,x)) return 1;
    30. }
    31. if(sub_node==0 ||dp[x]==0) //判断x是叶子节点的条件
    32. {
    33. if(dp[fa]!=0) return 1;
    34. //判断x是不是叶子节点,如果是的话,x的父节点(fa)也没没标记过,说明x是fa唯一的叶节点
    35. dp[x]=++idx;
    36. dp[fa]=idx;
    37. }
    38. return 0;
    39. }
    40. void dfs2(int x,int fa)
    41. {
    42. for(int i=head[x];i!=-1;i=edge[i].next)
    43. {
    44. if(edge[i].value==fa)
    45. {
    46. continue;
    47. }
    48. if(dp[x]==dp[edge[i].value])
    49. {
    50. print_color[edge[i].value]=print_color[x];
    51. }
    52. else{
    53. print_color[edge[i].value]=!print_color[x];
    54. }
    55. dfs2(edge[i].value,x);
    56. }
    57. }
    58. int main() {
    59. int n,pos=1;
    60. scanf("%d",&n);
    61. memset(head,-1,sizeof(head));
    62. memset(edge,-1,sizeof(edge));
    63. for(int i=1;i<n;i++)
    64. {
    65. int a,b;
    66. scanf("%d%d",&a,&b);
    67. addedge(a,b,pos);
    68. pos++;
    69. addedge(b,a,pos);
    70. pos++;
    71. }
    72. int res1=dfs1(1,0);
    73. if(res1||dp[0])
    74. {
    75. printf("-1\n");
    76. return 0;
    77. }
    78. print_color[1]=1;
    79. dfs2(1,0);
    80. for(int i=1;i<=n;i++)
    81. {
    82. if(print_color[i]==1)
    83. {
    84. printf("R");
    85. }
    86. else{
    87. printf("B");
    88. }
    89. }
    90. printf("\n");
    91. return 0;
    92. }

  • 相关阅读:
    Jenkins--部署--01--打包Maven项目为Docker镜像并运行
    查网站域名历史,查域名有没有灰记录,查域名有多少外链的好工具
    mybatis中resultMap与resultType的区别
    WEB网页设计期末作业个人主页——基于HTML+CSS制作个人简介网站
    鸿蒙APP开发时WebView导致Log功能异常
    TRC心血管研究之艾美捷TRC高血压研究领域
    [oeasy]python0013_ASCII码表_英文字符编码_键盘字符
    Linux内存管理知识总结(一)
    Linux进程管理和计划任务与系统备份恢复
    Docker18:Docker- compose容器编排
  • 原文地址:https://blog.csdn.net/qq_42434171/article/details/127037538