第一种,直接用字符串做
#include <iostream>
using namespace std;
struct node{
string name;
int num;
};
node a[20002];
int find(int x){
if(a[x].num==x){
return x;
}else{
while(a[x].num!=x){
x=a[x].num=a[a[x].num].num;
}
return x;
}
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].name;
a[i].num=i;
}
for(int j=1;j<=m;j++){
string e,f;
cin>>e>>f;
int flag1=0,flag2=0;
for(int i=1;i<=m;i++){
if(a[i].name==e){
flag1=i;
}
if(a[i].name==f){
flag2=i;
}
if(flag1!=0&&flag2!=0){
break;
}
}
a[find(flag1)].num=find(flag2);
}
int sum;
cin>>sum;
for(int j=0;j<sum;j++){
int flag1=0,flag2=0;
string e,f;
cin>>e>>f;
for(int i=1;i<=m;i++){
if(a[i].name==e){
flag1=i;
}
if(a[i].name==f){
flag2=i;
}
if(flag1!=0&&flag2!=0){
break;
}
}
if(find(flag1)==find(flag2)){
cout<<"Yes."<<endl;
}else{
cout<<"No."<<endl;
}
}
return 0;
}
第二种,用c++函数map
#include <iostream>
#include <map>
using namespace std;
map<string,int>a;
int b[20001];
int find(int num){
if(b[num]==num){
return num;
}else{
while(b[num]!=num){
num=b[num]=b[b[num]];
}
return num;
}
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s;
a[s]=i;
b[i]=i;
}
for(int i=0;i<m;i++){
string e,f;
cin>>e>>f;
int flag1=a[e];
int flag2=a[f];
b[find(flag1)]=find(flag2);
}
int sum;
cin>>sum;
for(int i=0;i<sum;i++){
string e,f;
cin>>e>>f;
if(find(a[e])==find(a[f])){
cout<<"Yes."<<endl;
}else{
cout<<"No."<<endl;
}
}
return 0;
}