博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ant on the Tree CodeForces - 29D(Lca+暴力)
阅读量:4136 次
发布时间:2019-05-25

本文共 2871 字,大约阅读时间需要 9 分钟。

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.

Examples

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
题意:要按照给定的叶子节点的顺序去遍历整棵树,判断是否合理,如果合理的话最后输出路径。
思路:我们dfs的时候处理出所有的根节点到叶子节点的路径。之后找出两个叶子节点的lca,暴力找出他们之间的路径。所有的处理完之后,判断经过的节点个数是否为2*n-1。
代码如下:

#include
#define ll long longusing namespace std;const int maxx=3e2+10;struct node{
int to,next;}e[maxx<<1];int head[maxx];int lef[maxx];int in[maxx],deep[maxx];int dp[maxx][26];int ans[1000005];int n,tot,sign;vector
p[maxx];/*---------事前准备--------*/inline void init(){
memset(head,-1,sizeof(head)); tot=0;}inline void add(int u,int v){
e[tot].to=v,e[tot].next=head[u],head[u]=tot++;}/*------------dfs------------*/inline void dfs(int u,int f){
deep[u]=deep[f]+1; dp[u][0]=f; for(int i=1;i<=20;i++) {
if(dp[u][i-1]) dp[u][i]=dp[dp[u][i-1]][i-1]; else break; } p[u]=p[f];//vector存储路径 for(int i=head[u];i!=-1;i=e[i].next) {
int to=e[i].to; if(to==f) continue; p[u].push_back(to); dfs(to,u); p[u].pop_back(); }}/*-----------lca----------*/inline int get_lca(int x,int y){
if(deep[x]
=0;i--) {
if(dp[x][i]!=dp[y][i]) {
x=dp[x][i]; y=dp[y][i]; } } return dp[x][0];}int main(){
int x,y; scanf("%d",&n); init(); for(int i=1;i
2*n-1) {
puts("-1"); return 0; } } for(int i=p[lef[k]].size()-2;i>=0;i--) ans[++cnt]=p[lef[k]][i]; if(cnt!=2*n-1) puts("-1"); else {
for(int i=1;i<=cnt;i++) cout<
<<" "; cout<

努力加油a啊,(o)/~

转载地址:http://cftvi.baihongyu.com/

你可能感兴趣的文章