一直只会离线的,今天学了下在线的
自己AC的4600+ms 试了下网上加了优化的2000+
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<map>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn=100100;
int n,m;
int ind[maxn],dep[maxn],fa[maxn],vis[maxn],dis[maxn];
struct node
{
int v,w;
};
map<string,int> mp;
vector<node> vec1[maxn];
void init()
{
for(int i=0;i<=n;i++)
vec1[i].clear();
mp.clear();
memset(ind,0,sizeof(ind));
memset(fa,0,sizeof(fa));
memset(dep,-1,sizeof(dep));
memset(dis,0,sizeof(dis));
}
void dfs(int u,int f,int deep)
{
fa[u]=f;
dep[u]=deep;
for(int i=0;i<vec1[u].size();i++)
{
int v=vec1[u][i].v;
if(v==f)
continue;
dis[v]=dis[u]+vec1[u][i].w;
dfs(v,u,deep+1);
}
}
int lca(int u,int v)
{
if(dep[u]<dep[v])
swap(u,v);
while(dep[u]!=dep[v])
u=fa[u];
while(u!=v)
{
u=fa[u];
v=fa[v];
}
return u;
}
int main()
{
freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
int i,j;
string x,y;
int k=1;
for(i=0;i<n-1;i++)
{
cin>>x>>y;
if(mp[x]==0)
mp[x]=k++;
if(mp[y]==0)
mp[y]=k++;
node tmp;
tmp.v=mp[x];
tmp.w=1;
vec1[mp[y]].push_back(tmp);
fa[mp[x]]=mp[y];
ind[mp[x]]++;
}
for(i=1;i<=n;i++)
{
if(ind[i]==0)
{
dfs(i,-1,0);
}
}
while(m--)
{
cin>>x>>y;
if(mp[x]==mp[y])
{
printf("0\n");
continue;
}
if(lca(mp[x],mp[y])==mp[x])
{
printf("1\n");
continue;
}
if(lca(mp[x],mp[y])==mp[y])
printf("%d\n",dis[mp[x]]-dis[lca(mp[x],mp[y])]);
else
printf("%d\n",dis[mp[x]]-dis[lca(mp[x],mp[y])]+1);
}
}
return 0;
}