一道水题…数据量较小,很多方法都能做。
我用的是并查集。
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3786
题意:给n个关系你,然后询问m个问题,问题就是问你两个人是否为直系亲属,是就输出关系,不是就输出-。题意明了
思路:用并查集来表示这个亲属图,以孩子作为根。两个人是否有关系就是一个点在找根的路径上是否会遇见另一个点,相遇就有,不相遇就是没有关系。
以下是AC代码: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
61
62
63
64
65
66
67
68
69
70
using namespace std;
int N,M;
int par[30];
char a[4],b[3];
int one,two;
void init(){
for(int i=0;i<30;i++){
par[i]=i;
}
}
int find(int x,int y){
int res=0;
while(x!=y&&x!=par[x]){
res++;
x=par[x];
}
if(x==y)
return res;
else
return 0;
}
void solve(){
init();
for(int i=0;i<N;i++){
scanf("%s",a);
for(int j=1;j<3;j++){
if(a[j]!='-'){
par[(int)a[j]-'A']=(int)a[0]-'A';
}
}
}
while(M--){
scanf("%s",b);
int res=find((int)b[0]-'A',(int)b[1]-'A');
if(res){
switch(res){
case 1: printf("parent\n");break;
case 2: printf("grandparent\n"); break;
default: for(int i=0;i<res-2;i++){
printf("great-");
}
printf("grandparent\n"); break;
}
}
else{
res=find((int)b[1]-'A',(int)b[0]-'A');
switch(res){
case 0: printf("-\n");break;
case 1: printf("child\n");break;
case 2: printf("grandchild\n"); break;
default: for(int i=0;i<res-2;i++){
printf("great-");
}
printf("grandchild\n"); break;
}
}
}
}
int main()
{
while(scanf("%d%d",&N,&M)!=EOF&&(M||N)){
solve();
}
return 0;
}
找出直系亲属
-------------本文结束感谢您的阅读-------------
- 本文链接: https://ihopezero.github.io/2019/04/26/找出直系亲属/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!