int mincost_maxflow() { piS = cost = 0; while(modlabel()) { do { CLR(v,0); }while(aug(S, INF)); } return -cost; }
int main(){ scanf("%d", &N); S = 0, T = 2 * N + 1; for(int i = 1; i < N; ++i){ int x, y; scanf("%d%d", &x, &y); treeEdge[x].push_back(y); treeEdge[y].push_back(x); } getMark(); for(int i = N; i > 1; --i){ addedge(i, fa[i], T); } std::vector<std::pair<int, std::pair<int, int> > > rems; for(int i = 1; i <= N; ++i){ int x, y; scanf("%d%d", &x, &y); if(depth[x] > depth[y]) std::swap(x, y); if(x == 1 || mark[x] == mark[y]){ preQ[y].push(std::make_pair(depth[x], i)); } else{ addedge(S, N + i, 1); addedge(N + i, x, 1); addedge(N + i, y, 1); rems.push_back(std::make_pair(i, std::make_pair(x, y))); } } memset(vis, 0, sizeof(vis)); if(!getPreDecide(1) || preQ[1].size()){ printf("No\n"); return 0; } for(int i = 1; i <= N; ++i){ if(!decided[i]){ addedge(i, T, 1); } } maxflow = 0; while(modlabel()){ maxflow += aug(S, T); } if(maxflow != N - preDecide){ printf("No\n"); return 0; } for(int i = 1; i <= N; ++i){ for(edge *ii = V[N + i]; ii; ii = ii -> nxt){ if(ii -> u == 0 && ii -> t > 0 && ii -> t <= N){ toDecide[ii -> t].push_back(i); } } } memset(vis, 0, sizeof(vis)); getAnswer(1); printf("Yes\n"); for(int i = 1; i <= N; ++i){ printf("%d%c", ans[i], i == N ? '\n' : ' '); } return 0; }
void costflow(int n) { while (modlabel(n)) do{ memset(vis,0,sizeof(vis)); }while(aug(s,INF)); }