1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| const int N=2e3+100; int n,m; int A[N],B[N],ans,a[N<<1],b[N<<1]; int q[N],anc[N],deg[N],dep[N]; int dir[N<<1]; int ch[N<<1][2]; bool rev[N<<1],vis[N],mark[N<<1],used[N][2]; int head[N]; struct edge{ int ver,Next; edge(int ver=0,int Next=0):ver(ver),Next(Next){}}; vector<edge> G;
inline void addedge(int u,int v){ G.push_back(edge(v,head[u])),head[u]=G.size()-1; G.push_back(edge(u,head[v])),head[v]=G.size()-1; ++deg[u],++deg[v];}
void dfs(int u,int c){ if(!u) return; c^=rev[u]; dir[u]=c; dfs(ch[u][0],c); dfs(ch[u][1],c^1); }
void getdep(int u){ for(rei i=head[u];~i;i=G[i].Next){ rei v=G[i].ver; if(v==anc[u]) continue; dep[v]=dep[u]+1,anc[v]=u; getdep(v); } }
inline void upd(int x,int c){ used[x][c] ? 0 : (used[x][c]=1,++ans);}
int main(){ memset(head,-1,sizeof head); scanf("%d%d",&n,&m); for(rei i=1,a,b;i<n;++i) scanf("%d%d",&a,&b),addedge(a,b); for(rei i=1;i<=m;++i) scanf("%d%d",&A[i],&B[i]),a[i]=A[i],b[i]=B[i]; rei hd=0,tl=0; for(rei i=1;i<=n;++i) if(deg[i]==1) q[tl++]=i; rei T=n,cnt=m; while(T--){ rei u=q[hd++]; vis[u]=1; for(rei i=head[u],y;~i;i=G[i].Next){ y=G[i].ver; if(--deg[y]==1) q[tl++]=y;} vector<int> E; for(rei i=1;i<=cnt;++i) if(!mark[i]){ if(a[i]==u && b[i]==u){ dfs(i,0); continue;} if(b[i]==u) swap(a[i],b[i]),rev[i]^=1; if(a[i]==u) E.push_back(i); } rei w=-1; for(rei i=head[u],y;~i;i=G[i].Next){ y=G[i].ver; if(vis[y]) continue; w=y; break; } while(E.size()){ if(E.size()==1){ rei e=E[0]; a[e]=w; break;} rei x=E.back(); E.pop_back(); rei y=E.back(); E.pop_back(); ++cnt; ch[cnt][0]=x,ch[cnt][1]=y; a[cnt]=b[y],b[cnt]=b[x]; mark[x]=mark[y]=1; } } getdep(1); for(rei i=1;i<=m;++i){ if(dir[i]) swap(A[i],B[i]); rei u=A[i],v=B[i]; while(dep[u]>dep[v]) upd(u,0),u=anc[u]; while(dep[u]<dep[v]) upd(v,1),v=anc[v]; while(u!=v){ upd(u,0),u=anc[u]; upd(v,1),v=anc[v]; } } printf("%d\n",ans); for(rei i=1;i<=m;++i) printf("%d %d\n",A[i],B[i]); getchar(),getchar(); return 0; }
|
Related Issues not found
Please contact @noone40404 to initialize the comment