Bubble Cup 9 - Finals E. 搜索

E. Paint it really, really dark gray
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

I see a pink boar and I want it painted black. Black boars look much more awesome and mighty than the pink ones. Since Jaggy became the ruler of the forest, he has been trying his best to improve the diplomatic relations between the forest region and the nearby ones.

Some other rulers, however, have requested too much in return for peace between their two regions, so he realized he has to resort to intimidation. Once a delegate for diplomatic relations of a neighboring region visits Jaggy’s forest, if they see a whole bunch of black boars, they might suddenly change their mind about attacking Jaggy. Black boars are really scary, after all.

Jaggy’s forest can be represented as a tree (connected graph without cycles) with n vertices. Each vertex represents a boar and is colored either black or pink. Jaggy has sent a squirrel to travel through the forest and paint all the boars black. The squirrel, however, is quite unusually trained and while it traverses the graph, it changes the color of every vertex it visits, regardless of its initial color: pink vertices become black and black vertices become pink.

Since Jaggy is too busy to plan the squirrel’s route, he needs your help. He wants you to construct a walk through the tree starting from vertex 1 such that in the end all vertices are black. A walk is a sequence of vertices, such that every consecutive pair has an edge between them in a tree.

Input

The first line of input contains integer n (2 ≤ n ≤ 200 000), denoting the number of vertices in the tree. The following n lines contains nintegers, which represent the color of the nodes.

If the i-th integer is 1, if the i-th vertex is black and  - 1 if the i-th vertex is pink.

Each of the next n - 1 lines contains two integers, which represent the indexes of the vertices which are connected by the edge. Vertices are numbered starting with 1.

Output

Output path of a squirrel: output a sequence of visited nodes' indexes in order of visiting. In case of all the nodes are initially black, you should print 1. Solution is guaranteed to exist. If there are multiple solutions to the problem you can output any of them provided length of sequence is not longer than 107.

Example
input
5
1
1
-1
1
-1
2 5
4 3
2 4
4 1
output
1 4 2 5 2 4 3 4 1 4 1
Note

At the beginning squirrel is at node 1 and its color is black. Next steps are as follows:

  • From node 1 we walk to node 4 and change its color to pink.
  • From node 4 we walk to node 2 and change its color to pink.
  • From node 2 we walk to node 5 and change its color to black.
  • From node 5 we return to node 2 and change its color to black.
  • From node 2 we walk to node 4 and change its color to black.
  • We visit node 3 and change its color to black.
  • We visit node 4 and change its color to pink.
  • We visit node 1 and change its color to pink.
  • We visit node 4 and change its color to black.

  • We visit node 1 and change its color to black.


题意:
有一棵树,每个节点有两种颜色,1表示黑色,-1表示粉色,为了让所有节点变成黑色,决定派一只松鼠从1号节点进入树,松鼠经过的节点颜色会翻转,黑色变成粉色,粉色变成黑色,松鼠该一什么路径走才能使所有节点变成黑色呢?输出路径

   用一个数组记录颜色,从1号节点深搜,每经过一个节点要改变颜色,当深搜到底返回时判断儿子节点颜色,如果是粉色,那么要再走到儿子结点再回来,黑色不用管,最后遍历完,如果1号是粉色,那么要选择一个儿子节点走到儿子节点再走到1号节点再走到儿子节点,儿子节点遍历两次颜色不变,1号节点遍历一次颜色取反,如果1号是hi黑色,不用管
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <bits/stdc++.h>
using namespace std;

const int maxn=2000000+100;
vector<int>G[maxn];
int color[maxn];
void put(int x)
{
    color[x]=-color[x];
    printf(" %d",x);
}
void dfs(int u,int pre)
{
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v==pre)
            continue;
        put(v);
        dfs(v,u);
        put(u);

        if(color[v]==-1)
        {
            put(v);
            put(u);
        }
    }
    if(u==1&&color[u]==-1)
    {
        int v=G[u][0];
        put(v);
        put(u);
        put(v);
    }
}
int main()
{
    int n;
    int u,v;
    while(scanf("%d",&n)!=-1)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&color[i]);
        }

        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        printf("1");
        dfs(1,1);

        puts("");
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值