利用并查集加各种判断,整了一个多小时
#include<iostream>
using namespace std;
#define N 30
int father[N];
int num;
//初始化并查集
void Init() {
for (int i = 1; i <= N; i++) {
father[i] = i;
}
}
void Findrelation(int x,int y) {
if (father[y] != x) {
Findrelation(x,father[y]);
num++;
}
return;
}
void Union(int x, int y) {
if (x != y) {
father[y] = x;
}
}
//非路径压缩版本
int Find(int x,int y) {
int a = x, b = y;
while (father[x] != x) {
x = father[x];
if (x == y) return 1;
}
while (father[b] != b) {
b = father[b];
if (a == b) return 2;
}
return 3; // 1表示x为y的祖先 ,2表示y为x祖先,3表示没有关系
}
int main() {
//用1到26表示A到Z
int n, m;
while (cin >> n >> m) {
Init();
for (int i = 0; i < n; i++) {
char a, b, c;
cin >> a >> b >> c;
Union(a - 'A' + 1, b - 'A' + 1);
Union(a - 'A' + 1, c - 'A' + 1);
}
for (int i = 0; i < m; i++) {
char a, b;
cin >> a >> b;
num = 0;
if (Find(a-'A'+1,b-'A'+1) == 3) {
cout << '-' << endl;
continue;
}
if (Find(a - 'A' + 1, b - 'A' + 1) == 1)
{
Findrelation(b - 'A' + 1, a - 'A' + 1);
if (num == 0)
cout << "parent" << endl;
else if (num > 0)
{
while ((num--) > 1) {
cout << "great-";
}
cout << "grandparent" << endl;
}
}
else {
Findrelation(a - 'A' + 1, b - 'A' + 1);
if (num == 0)
cout << "child" << endl;
else if (num > 0)
{
while ((num--) > 1) {
cout << "great-";
}
cout << "grandchild" << endl;
}
}
}
}
}