利用并查集加各种判断,整了一个多小时 #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; } } } } }