描述
给定若干家庭成员之间的关系,判断2个人是否属于同一家庭,即2个人之间均可以通过这些关系直接或者间接联系。
输入
输入数据有多组,每组数据的第一行为一个正整数n(1<=n<=100),表示有100个关系描述,接下来有n行,每行的描述方式为:
p1 p2 c
其中p1、p2和c均为一串文本,表示每个人的姓名,p1和p2为c的父亲和母亲。
最后一行包含2个字符串a和b,为待判断的两个人的姓名。
每个人的姓名由大小写字母组成,长度不超过80。
若n为0,表示输入结束。
输出
如果a和b在同一个家庭中,则输出Yes
否则输出No
样例输入
样例输出
题目来源
解题思路:映射一下 然后并查集就好了
菜鸡的成长史 ^_^

1 #include <bits/stdc++.h> 2 using namespace std; 3 int arr[505]; 4 int find_root(int x) {return arr[x]==x?x:arr[x]=find_root(arr[x]);} 5 void unionset(int x,int y) 6 { 7 int xx=find_root(x),yy=find_root(y); 8 if(xx!=yy) arr[xx]=yy; 9 } 10 int main() 11 { 12 ios::sync_with_stdio(false); 13 int n,m; 14 string s,s1,s2,name,name1; 15 while(cin>>n&&n!=0) 16 { 17 int num=0; 18 map<string,int> ma; 19 ma.clear(); 20 for(int i=1;i<=505;i++) 21 arr[i]=i; 22 for(int i=1;i<=n;i++){ 23 cin>>s>>s1>>s2; //给字符编一个号 24 if(!ma[s]) ma[s]=++num; 25 if(!ma[s1]) ma[s1]=++num; 26 if(!ma[s2]) ma[s2]=++num; 27 unionset(ma[s],ma[s1]),unionset(ma[s],ma[s2]); 28 } 29 cin>>name>>name1; 30 if(ma[name]==0||ma[name1]==0) {cout << "No" << endl;continue;} 31 if(find_root(ma[name])==find_root(ma[name1])) 32 cout << "Yes"; 33 else cout << "No"; cout << endl; 34 } 35 return 0; 36 }