CF29D 树的遍历

http://codeforces.com/problemset/problem/29/D

D. Ant on the Tree
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Connected undirected graph without cycles is called a tree. Trees is a class of graphs which is interesting not only for people, but for ants too.

An ant stands at the root of some tree. He sees that there are n vertexes in the tree, and they are connected by n - 1 edges so that there is a path between any pair of vertexes. A leaf is a distinct from root vertex, which is connected with exactly one other vertex.

The ant wants to visit every vertex in the tree and return to the root, passing every edge twice. In addition, he wants to visit the leaves in a specific order. You are to find some possible route of the ant.

Input

The first line contains integer n (3 ≤ n ≤ 300) — amount of vertexes in the tree. Next n - 1 lines describe edges. Each edge is described with two integers — indexes of vertexes which it connects. Each edge can be passed in any direction. Vertexes are numbered starting from 1. The root of the tree has number 1. The last line contains k integers, where k is amount of leaves in the tree. These numbers describe the order in which the leaves should be visited. It is guaranteed that each leaf appears in this order exactly once.

Output

If the required route doesn't exist, output -1. Otherwise, output 2n - 1 numbers, describing the route. Every time the ant comes to a vertex, output it's index.

Sample test(s)
input
3
1 2
2 3
3
output
1 2 3 2 1 
input
6
1 2
1 3
2 4
4 5
4 6
5 6 3
output
1 2 4 5 4 6 4 2 1 3 1 
input
6
1 2
1 3
2 4
4 5
4 6
5 3 6
output
-1
/**
CF29D 树的遍历
题目大意:
         给定一个树以1为根节点,给定每个叶子节点的遍历顺序,从1出发按照此顺序遍历最后再回到1,
         经过没条边2次,问是否可以,若可以输出之
解题思路:
        这是一棵树(无向无环连通图),那么我们遍历的时候假设一直的叶子节点分别为a1,a2,a3,
        那么我们先dfs出1~a1之间的路,接着a1~a2,a2~a3,a3~1,过程中统一放在一个容器中,最后若正好
        是2*n-1个点加入容器,那么就有解(无向无环图,点u到点v的路径如果有那就只有一条,说明这个
        方法可行),输出就好了
*/
#include 
#include 
#include 
#include 
#include 
using namespace std;

int n;
vector vec[500],a;

bool dfs(int root,int u,int pre)
{
    if(root==u)return 1;
    for(int i=0; i


你可能感兴趣的:(图论,数据结构)