TZOJ:3660: 家庭关系

描述

给定若干家庭成员之间的关系,判断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

样例输入

样例输出

题目来源

TZOJ

解题思路:映射一下 然后并查集就好了

菜鸡的成长史 ^_^

 

 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 }
View Code

 

 

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/10617984.html
今日推荐