题意
思路
实现
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int maxn = 1e5+5;
vector<int> g[maxn];
typedef pair<int,int >pii;
#define pb push_back
#define fi first
#define se second
#define mp make_pair
map<string,int> mapp;
string rmapp[maxn];
int mark[maxn];
vector<pii> ask[maxn];
int ans[maxn];
int fa[maxn];
int find(int x){
if (fa[x] == x)
return x;
return fa[x] = find(fa[x]);
}
void unin(int x,int y){
x= find(x);
y = find(y);
if (x == y)
return;
fa[x] = y;
}
void dfs(int u,int f){
for (int i=0;i<ask[u].size();i++){
int v = ask[u][i].se;
if (mark[v] == 0 || ans[ask[u][i].fi] != 0){
continue;
}
if (mark[v] == 1){
ans[ask[u][i].fi] = v;
}
else{
ans[ask[u][i].fi] = find(v);
}
}
for (int i=0;i<g[u].size();i++){
int v = g[u][i];
mark[v] = 1;
dfs(v,u);
}
unin(u,f);
mark[u] = 2;
}
int main(){
ios::sync_with_stdio(false);
int now = 1;
cin>>n;
for (int i=1;i<=n;i++)
fa[i] = i;
string str1,str2;
for (int i=0;i<n;i++){
cin>>str1>>str2;
if (mapp[str1] == 0){
mapp[str1] = now;
rmapp[now] = str1;
now++;
}
if (mapp[str2] == 0){
mapp[str2] = now;
rmapp[now] = str2;
now++;
}
g[mapp[str1]].pb(mapp[str2]);
}
cin>>m;
for (int i=0;i<m;i++){
cin>>str1>>str2;
ask[mapp[str1]].pb(mp(i,mapp[str2]));
ask[mapp[str2]].pb(mp(i,mapp[str1]));
}
mark[1] = 1;
dfs(1,1);
for (int i=0;i<m;i++){
cout << rmapp[ans[i]] <<"\n";
}
return 0;
}