描述
给定若干家庭成员之间的关系,判断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
样例输入
2
Barbara Bill Ted
Nancy Ted John
John Barbara
3
Lois Frank Jack
Florence Bill Fred
Annie Fred James
James Jack
0
样例输出
Yes
No
floyd传递闭包
写了好长时间,一直得不到正确答案,后来发现map没有清空~~~欲哭无泪!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 |
#include <stdio.h> #include <map> #include <string> #include <iostream> #define MAXN 350 using
namespace
std; int
cnt; int
f[MAXN][MAXN]; map< string, int
> M; void
floyd(){ for ( int
k=1; k<cnt; k++){ for ( int
i=1; i<cnt; i++){ for ( int
j=1; j<cnt; j++){ if ( f[i][k] && f[k][j]) f[i][j]=f[i][k] && f[k][j]; } } } } void
addedge( int
u, int
v){ f[u][v]=1; f[v][u]=1; } void
init(string fa, string ma, string ch, int & cnt){ if (M[fa]==0)M[fa]=cnt++; if (M[ma]==0)M[ma]=cnt++; if (M[ch]==0)M[ch]=cnt++; addedge(M[fa],M[ma]); addedge(M[ma],M[ch]); addedge(M[fa],M[ch]); } int
main( int
argc, char
*argv[]) { int
n; string a,b; while ( scanf ( "%d" ,&n)!=EOF && n){ M.clear(); memset (f,0, sizeof (f)); cnt=1; for ( int
u=1; u<=n; u++){ string fa,ma,ch; cin>>fa>>ma>>ch; init(fa,ma,ch,cnt); } floyd(); cin>>a>>b; if (f[M[a]][M[b]]){ cout<< "Yes" <<endl; } else { cout<< "No" <<endl; } } return
0; } |
原文:http://www.cnblogs.com/chenjianxiang/p/3534757.html