比较直接。
#include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define INF 99999999 #define ll __int64 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define mod 1000000007 using namespace std; const int MAXN = 100010; struct node { int to; int next; }edge[MAXN*2]; struct Node { int to; int lca; int num; int next; }a[MAXN*2]; int pa[MAXN],ac[MAXN],pre[MAXN],vis[MAXN],ind,num[MAXN],ind1,pre1[MAXN],in[MAXN]; int n,m,lca[MAXN]; string s1[MAXN],s2[MAXN]; map<string,int>mp; void add(int x,int y) { edge[ind].to = y; edge[ind].next = pre[x]; pre[x] = ind ++; } void Add(int x,int y,int num) { a[ind1].num = num; a[ind1].to = y; a[ind1].next = pre1[x]; pre1[x] = ind1 ++; } int find(int x) { if(x != pa[x]) pa[x] =find(pa[x]); return pa[x]; } void dfs(int rt,int d) { int i; vis[rt] = 1; ac[rt] = rt; num[rt] = d; for(i=pre[rt]; i!=-1; i=edge[i].next){ int t = edge[i].to; if(!vis[t]){ dfs(t,d+1); int fx = find(rt); int fy = find(t); if(fx != fy){ pa[fy] = fx; ac[t] = fx; } } } for(i=pre1[rt]; i!=-1; i=a[i].next){ int t = a[i].to; if(vis[t]){ int fp = ac[find(t)]; a[i].lca = fp; a[i^1].lca = fp; lca[a[i].num] = fp; } } } int main() { int i,t,cnt; cin>>t; while(t--) { cnt = 0; ind = 0; memset(pre,-1,sizeof(pre)); memset(ac,0,sizeof(0)); memset(in,0,sizeof(in)); scanf("%d%d",&n,&m); for(i=1; i<=n; i++){ pa[i] = i; num[i] = 1; } mp.clear(); for(i=1; i<n; i++){ string ss1,ss2; cin>>ss1>>ss2; if(!mp[ss1]) mp[ss1] = ++cnt; if(!mp[ss2]) mp[ss2] = ++cnt; add(mp[ss2],mp[ss1]); add(mp[ss1],mp[ss2]); in[mp[ss1]]++; } ind1 = 0; memset(pre1,-1,sizeof(pre1)); memset(vis,0,sizeof(vis)); for(i=1; i<=m; i++){ cin>>s1[i]>>s2[i]; Add(mp[s1[i]],mp[s2[i]],i); Add(mp[s2[i]],mp[s1[i]],i); } for(i=1; i<=cnt; i++){ if(!in[i]){ break; } } dfs(i,0); for(i=1; i<=m; i++){ int ans = 0; ans = num[mp[s1[i]]] - num[lca[i]]; if(lca[i] != mp[s2[i]]) ans++; if(mp[s1[i]] == mp[s2[i]]){ ans = 0; } cout<<ans<<endl; } } return 0; }