BUPT 2017 summer training (for 16) #1H

题意

每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点。求一条路径使得所有点变成黑色。

题解

dfs时每个节点的孩子处理完,这时候如果颜色是白色,那么再去一下父亲节点再回来,就变成黑色了。

如果是1号点,那就去它的孩子节点,再回来,再去它孩子节点。

代码

#include <cstdio>
#define N 200005
struct edge{
int to,next;
}e[N<<1];
int head[N],cnt;
int n,a[N];
void add(int u,int v){
e[++cnt]=(edge){v,head[u]};
head[u]=cnt;
}
int ans[N<<1],top;
void dfs(int x,int fa){
ans[++top]=x;
a[x]*=-1;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
dfs(v,x);
ans[++top]=x;
a[x]*=-1;
}
if(a[x]==-1){
if(x!=1){
ans[++top]=fa;
a[fa]*=-1;
ans[++top]=x;
a[x]=1;
}else{
ans[++top]=e[head[1]].to;
ans[++top]=1;
ans[++top]=e[head[1]].to;
}
}
}
int main(){
scanf("%d",&n);
bool ex=0;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
if(a[i]==-1)
ex=1;
}
for(int i=1,u,v;i<n;++i){
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
if(!ex)printf("1");
else{
a[1]*=-1;
dfs(1,0);
for(int i=1;i<=top;++i)
printf("%d ",ans[i]);
}
return 0;
}

最新文章

  1. java-7311练习(下)
  2. poj3259 spfa
  3. linux命令:locate
  4. CodeForces - 417A(思维题)
  5. php class类的用法详细总结
  6. bzoj1049
  7. ProgressMonitorInputStream
  8. 一个参数引起的mysql从库宕机血案
  9. [笔记]LibSVM源码剖析(java版)
  10. docker 创建mysql镜像,并成功进行远程连接
  11. ABP中的拦截器之AuditingInterceptor
  12. testng + reportng 测试结果邮件发送
  13. A claim of type &#39;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier&#39; or &#39;http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider&#39; was not present on the pro
  14. (转)深度教程:POS和POW全解析
  15. [ 转载 ] Java中成员变量 和局部变量
  16. 五、java面向对象编程_3
  17. (1-1)入门—最简单的树(使用json数据)
  18. GCC 4.7相对4.6.x的改进点
  19. PAT 天梯赛 L1-026. I Love GPLT 【水】
  20. Tkinter 控件详细介绍

热门文章

  1. scrapy之持久化存储
  2. MySQL的SQL语句优化-group by语句的优化
  3. IdentityServer4【QuickStart】之使用asp.net core Identity
  4. [转帖]Linux下fork函数及pthread函数的总结
  5. 解决tab标签页,相同id时切换失灵的问题
  6. NLP的原理,框架及具体实例
  7. 老男孩python学习自修第八天【函数式编程】
  8. LODOOP中的各种边距 打印项、整体偏移、可打区域、内部边距
  9. LODOP循环多任务 同模版只设置不同队列任务名
  10. EChart.js 笔记一