Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("avx,avx2,fma")
- //#pragma GCC optimization ("unroll-loops")
- #define int long long
- #define pb push_back
- #define all(s) s.begin(),s.end()
- #define pii pair<int,int>
- #define fr first
- #define sc second
- #define bst ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- #define endl "\n"
- #define no cout << "NO" << endl;
- #define yes cout << "YES" << endl;
- using namespace std;
- const int N = 5e5 + 10, mod = 1e9 + 7, inf = 1e18 + 7, logn = 23;
- const double pi = acos(-1);
- vector<int> gr[N], order, ans;
- int tin[N], tout[N], timer, up[N][logn], dep[N];
- void dfs(int v, int pr = 1, int go = 0) {
- dep[v] = go;
- tin[v] = timer++;
- up[v][0] = pr;
- for(int i = 1; i < logn; i++) {
- up[v][i] = up[up[v][i - 1]][i - 1];
- }
- for(auto it: gr[v]) {
- if(it != pr) {
- dfs(it, v, go + 1);
- }
- }
- tout[v] = timer++;
- }
- bool upper(int a, int b) {
- return tin[a] <= tin[b] && tout[a] >= tout[b];
- }
- int lca(int a, int b) {
- if(upper(a, b)) return a;
- if(upper(b, a)) return b;
- for(int i = logn - 1; i >= 0; i--) {
- if(!upper(up[a][i], b)) {
- a = up[a][i];
- }
- }
- return up[a][0];
- }
- int len(int a, int b) {
- return dep[a] + dep[b] - 2 * dep[lca(a, b)];
- }
- void vpb(vector<int> &f, vector<int> &ar) {
- for(auto it: ar) {
- f.pb(it);
- }
- }
- void solve() {
- //soln
- int n, fine = 1;
- cin >> n;
- for(int i = 1; i < n; i++) {
- int l, r;
- cin >> l >> r;
- gr[l].pb(r);
- gr[r].pb(l);
- }
- int cnt = 0;
- for(int i = 2; i <= n; i++) {
- cnt += (gr[i].size() == 1);
- }
- order.pb(1);
- for(int i = 0; i < cnt; i++) {
- int tmp;
- cin >> tmp;
- order.pb(tmp);
- }
- order.pb(1);
- dfs(1);
- int sum = 0;
- for(int i = 1; i < order.size(); i++) {
- sum += len(order[i], order[i - 1]);
- }
- if(sum != 2 * n - 2) {
- fine = 0;
- }
- if(!fine) {
- cout << -1 << endl;
- } else {
- // create paths
- ans.pb(1);
- for(int i = 1; i < order.size(); i++) {
- int l = order[i - 1], r = order[i], cur;
- vector<int> path;
- if(upper(l, r)) {
- cur = r;
- while(cur != l) {
- path.pb(cur);
- cur = up[cur][0];
- }
- reverse(all(path));
- vpb(ans, path);
- continue;
- }
- if(upper(r, l)) {
- cur = l;
- while(cur != r) {
- cur = up[cur][0];
- path.pb(cur);
- }
- vpb(ans, path);
- continue;
- }
- int mid = lca(l, r);
- cur = l;
- while(cur != mid) {
- cur = up[cur][0];
- path.pb(cur);
- }
- vpb(ans, path);
- path.clear();
- cur = r;
- while(cur != mid) {
- path.pb(cur);
- cur = up[cur][0];
- }
- reverse(all(path));
- vpb(ans, path);
- }
- for(auto it: ans) {
- cout << it << " ";
- }
- cout << endl;
- }
- }
- main() {
- int t = 1;
- //cin >> t;
- while(t--) {
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment