「CodeForces - 717E」Paint it really, really dark gray (dfs)
2023-11-17 01:45:35
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;
}
最新文章
- java-7311练习(下)
- poj3259 spfa
- linux命令:locate
- CodeForces - 417A(思维题)
- php class类的用法详细总结
- bzoj1049
- ProgressMonitorInputStream
- 一个参数引起的mysql从库宕机血案
- [笔记]LibSVM源码剖析(java版)
- docker 创建mysql镜像,并成功进行远程连接
- ABP中的拦截器之AuditingInterceptor
- testng + reportng 测试结果邮件发送
- 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
- (转)深度教程:POS和POW全解析
- [ 转载 ] Java中成员变量 和局部变量
- 五、java面向对象编程_3
- (1-1)入门—最简单的树(使用json数据)
- GCC 4.7相对4.6.x的改进点
- PAT 天梯赛 L1-026. I Love GPLT 【水】
- Tkinter 控件详细介绍