http://codeforces.com/problemset/problem/29/D
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.
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.
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.
3 1 2 2 3 3
1 2 3 2 1
6 1 2 1 3 2 4 4 5 4 6 5 6 3
1 2 4 5 4 6 4 2 1 3 1
6 1 2 1 3 2 4 4 5 4 6 5 3 6
-1
/**
CF29D 树的遍历
题目大意:
给定一个树以1为根节点,给定每个叶子节点的遍历顺序,从1出发按照此顺序遍历最后再回到1,
经过没条边2次,问是否可以,若可以输出之
解题思路:
这是一棵树(无向无环连通图),那么我们遍历的时候假设一直的叶子节点分别为a1,a2,a3,
那么我们先dfs出1~a1之间的路,接着a1~a2,a2~a3,a3~1,过程中统一放在一个容器中,最后若正好
是2*n-1个点加入容器,那么就有解(无向无环图,点u到点v的路径如果有那就只有一条,说明这个
方法可行),输出就好了
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n;
vector<int> vec[500],a;
bool dfs(int root,int u,int pre)
{
if(root==u)return 1;
for(int i=0; i<vec[u].size(); i++)
{
int v=vec[u][i];
if(v==pre)continue;
if(dfs(root,v,u))
{
a.push_back(u);
return 1;
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
vec[i].clear();
for(int i=0; i<n-1; i++)
{
int u,v;
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
a.clear();
a.push_back(1);
int root=1;
for(int i=2; i<=n; i++)
{
if(vec[i].size()==1)
{
int u;
scanf("%d",&u);
dfs(root,u,-1);
root=u;
}
}
dfs(root,1,-1);
if(a.size()!=2*n-1)
{
printf("-1\n");
}
else
{
for(int i=0; i<a.size(); i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
printf("\n");
}
}
return 0;
}