当前位置: 首页 > news >正文

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

复制说明:

可以证明,无论怎么染色,都无法满足题目的要求。 
#include <iostream>
#include<string.h>
using namespace std;
int dp[100005];
int idx=0;
int print_color[100005];
//给每条边一个index,,也就是pos
struct edge{
    int value;
    int next;
}edge[200015];
int head[100005];// 存储树的索引节点
void addedge(int x,int y,int pos)
{
     edge[pos].value=y;
     edge[pos].next=head[x];
     head[x]=pos;
}
int dfs1(int x,int fa)
{
    int sub_node=0;
 
    for(int i=head[x];i!=-1;i=edge[i].next)
    {
        if(edge[i].value==fa)
        {
            continue;
        }
        sub_node++;
        if(dfs1(edge[i].value,x)) return 1;
    }
    if(sub_node==0 ||dp[x]==0) //判断x是叶子节点的条件
    {
        if(dp[fa]!=0) return 1; 
    //判断x是不是叶子节点,如果是的话,x的父节点(fa)也没没标记过,说明x是fa唯一的叶节点
        dp[x]=++idx;
        dp[fa]=idx;
    }
    return 0;
}

void dfs2(int x,int fa)
{
     for(int i=head[x];i!=-1;i=edge[i].next)
     {
          if(edge[i].value==fa)
        {
            continue;
        }
        if(dp[x]==dp[edge[i].value])
        {
            print_color[edge[i].value]=print_color[x];
        }
        else{
             print_color[edge[i].value]=!print_color[x];
        }
        dfs2(edge[i].value,x);
     }
}
int main() {
   int n,pos=1;
   scanf("%d",&n);
   memset(head,-1,sizeof(head));
   memset(edge,-1,sizeof(edge));
   for(int i=1;i<n;i++)
   {
       int a,b;
       scanf("%d%d",&a,&b);
       addedge(a,b,pos);
       pos++;
       addedge(b,a,pos);
       pos++;
   }
   int res1=dfs1(1,0);
   if(res1||dp[0])
   {
          printf("-1\n");
          return 0;
   }
   print_color[1]=1;
   dfs2(1,0);
   for(int i=1;i<=n;i++)
   {
       if(print_color[i]==1)
       {
           printf("R");
       }
       else{
           printf("B");
       }
   }
   printf("\n");
  return 0;
}

相关文章:

  • grafana+prometheus+(采集节点)实现监控Linux服务器,JVM,Postgres
  • Unity 之 发布字节抖音小游戏
  • Web配置过滤器,Cookie对象的简单使用
  • 进程入门与PCB基础知识.
  • 【云原生】设备云之基于FlexManager的C#SDK开发案例代码
  • Rust(7):数组类型
  • STM32——FLASH闪存编程原理与步骤
  • 计算机毕业设计之java+javaweb的大学生就业帮助系统-就业招聘网站
  • 跳表论文解读
  • 1061:求整数的和与均值
  • Day04JavaWeb第四次笔记---Maven的使用
  • Unrecognized option: --no-transfer-progress
  • 加载指定 having lines separator 时max_data_processor 不起作用
  • 高薪程序员面试题精讲系列150之电商专题(上)-你们的电商项目有什么特色?是B2B还是B2C、还是C2C的?直播电商你了解吗?
  • kafka是啥?虽然很难学,但是实验入门很简单
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux中的硬链接与软链接
  • MobX
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python学习之路13-记分
  • Redis学习笔记 - pipline(流水线、管道)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 配置 PM2 实现代码自动发布
  • 前端设计模式
  • 使用 Docker 部署 Spring Boot项目
  • 事件委托的小应用
  • 通过npm或yarn自动生成vue组件
  • 我是如何设计 Upload 上传组件的
  • 正则学习笔记
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​【已解决】npm install​卡主不动的情况
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $(selector).each()和$.each()的区别
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (补)B+树一些思想
  • (四)Linux Shell编程——输入输出重定向
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)jdk与jre的区别
  • ******之网络***——物理***
  • .NET Core WebAPI中封装Swagger配置
  • .NET 发展历程
  • .net 怎么循环得到数组里的值_关于js数组
  • [ C++ ] 继承
  • []我的函数库
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息
  • [JavaWeb]—Spring入门
  • [Loadrunner参数化]一个文件输两列参数的取值
  • [Lucas定理]【学习笔记】