[ 题解 ] [ 最小公共父节点 ] E. Family Tree

http://codeforces.com/group/NVaJtLaLjS/contest/238202/problem/E

题意:

输入数字N,还有两只牛的名字;

输入N行父子关系(题中为母女)即两个名字,前者是父,后者是子;

问两只牛是什么亲属关系。

具体的输出规则(亲属关系)请见原题。

示例:

Input:

7 AA BB
MOTHER AA
GGMOTHER BB
MOTHER SISTER
GMOTHER MOTHER
GMOTHER AUNT
AUNT COUSIN
GGMOTHER GMOTHER

Output:

BB is the great-aunt of AA

求最小公共父节点,看题目的示意图都能猜出来。

这里用C++的string变量好很多,我用strcmp比较,strcpy赋值/返回值写到吐血,最终还是得抄别人AC的C++......

(留下不会写C++的泪水,顺便围观了大佬的数组映射实现)

这个数组映射就是mother[i]字符串是daughter[i]的母亲(父节点)。

没有什么特别的,只是不需要写结构体,虽然查找父节点没有结构体链表快不过这数据量是不会超时的。

我解释下两个函数是什么:

find:找父节点。找到了返回父节点(母亲)的名字,没有就返回
""

issame:函数名不知道是什么意思。这个会找出a是b的ct级父节点,找不到就返回-1;

输入后我们先以A牛开始,不停找A牛的祖先,直到这个祖先就是B牛的祖先为止。

假如搜索到老祖宗也没有找到B牛的祖先,说明A,B不是亲属,输出"NOT
RELATED"。

记下A牛B牛到这个祖先的辈分。如果两个值都是1,说明是同一个母亲,输出"SIBLINGS";

如果两个值都大于1,说明只是同一个祖母(以上),关系是"COUSINS";

不是这两种情况就是祖先或者祖姨母,用复杂的输出规则输出。

(抄大佬的)代码如下:

 1 #include <stdio.h>
 2 #include <string>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6
 7 using namespace std;
 8
 9 int N;
10 string cowA,cowB;
11 string mother[102],daughter[102];
12 string now;
13
14 string find(string a)
15 {
16     for(int i=0;i<N;i++)
17     {
18         if(a==daughter[i])
19             return mother[i];
20     }
21     return "";
22 }
23 int issame(string a,string b)
24 {
25     int ct=0;
26     while(b!="")
27     {
28         if(a==b)return ct;
29         b=find(b);
30         ct++;
31     }
32     return -1;
33 }
34 int main()
35 {
36     cin >> N >> cowA >> cowB ;
37     for(int n=0;n<N;n++)
38         cin >> mother[n] >> daughter[n] ;
39     now=cowA;
40     int countA=0;
41     while(now!="")
42     {
43         if(issame(now,cowB)!=-1)break;
44         now=find(now);
45         countA++;
46     }
47     if(now=="")
48     {
49         puts("NOT RELATED");
50         return 0;
51     }
52     int countB=issame(now,cowB);
53     if(countA==countB && countA==1)
54     {
55         puts("SIBLINGS");
56         return 0;
57     }
58     else if(countA>1 && countB>1)
59     {
60         puts("COUSINS");
61         return 0;
62     }
63     else
64     {
65         if(countA<countB)
66         {
67             swap(cowA,cowB);
68             swap(countA,countB);
69         }
70         cout << cowB << " is the ";
71         for(int i=0;i<countA-2;i++)
72             printf("great-");
73         if(countA>1&&countB==0)
74             printf("grand-");
75         if(countB==0)
76             printf("mother");
77         else
78             printf("aunt");
79         cout << " of " << cowA << endl ;
80     }
81     return 0;
82 }

原文地址:https://www.cnblogs.com/Kaidora/p/10534701.html

时间: 2024-10-27 06:17:09

[ 题解 ] [ 最小公共父节点 ] E. Family Tree的相关文章

LCA最小公共父节点的解题思路

LCA最小公共父节点解法: 1.二叉搜索树: 中序遍历是升序,前序遍历即按序插入建树的序列. 二叉搜索树建树最好用前序+中序,如果用前序建树,最坏情况会退化为线性表,超时. 最近公共祖先甲级: A1143,1151 利用二叉搜索树的性质寻找结点u和v的最低公共祖先(递归解法) 1)如果根结点的值大于max(u,v),说明u和v均在根结点的左子树,则进入根结点的左子结点继续递归 2)如果根结点的值小于min(u,v),说明u和v均在根结点的右子树,则进入根结点的右子结点继续递归 3)剩下的情况就是

[LeetCode] 1123. Lowest Common Ancestor of Deepest Leaves 最深叶结点的最小公共父节点

Given a rooted binary tree, return the lowest common ancestor of its deepest leaves. Recall that: The node of a binary tree is a?leaf?if and only if it has no children The?depth?of the root of the tree is 0, and if the depth of a node is?d, the depth

输出二叉树中随机两个结点的最小公共父结点

思路:当遇到一个结点是返回1,当左右子树都返回1的时候,即最小公共父节点. //二叉树的数据结构 typedef struct MyStruct { char data; struct MyStruct *leftChild; struct MyStruct *rightChild; }Node, *Tree; //查找方法 int findFirstFather(Tree root, char first, char second,char &destination){ int i, j; i

LCA-最小公共父节点

有一个普通二叉树,AB分别为两个子节点,求AB最近(深度最大)的公共父节点. 此题仍然是一个老题,有着多种解决方法,本文针对其中三种方法来进行分析总结. 这三种方法分别是:递归法,tarjan离线算法,RMQ在线算法. 递归法 递归法比较直观简单,思路如下: 首先判定当前节点root是否是A节点或者B节点,若是的话直接返回该节点 若不是,分别对root节点的左右子树进行递归查找最小公共父节点,若左右子树都返回了节点,那么表示当前节点就是最小公共父节点,若只有其中一个子树返回了结果,那么就返回该结

二叉树中两个节点的最近公共父节点

这是京东周六的笔试题目   当时不在状态,现在想来肯定是笔试就被刷掉了,权当做个纪念吧.  这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个方法很简单,不需要详细解释的. 情况二:节点只有左.右指针,没有parent指针,root已知思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是这两个节点的最

4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点

4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tree. Avoid storing additional nodes in a data structure. NOTE: This is not necessarily a binary search tree. LeetCode上的原题,请参见我之前的博客Lowest Common Ancest

[LeetCode] Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w

[LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has

二叉树最近公共父节点

在二叉树中找最近公共父节点.分为两种情况,一种是有父指针,一种没有父指针. 1.有父指针 这种情况比较简单,计算两个结点的深度,再把深度大的向上移,移到同一深度.在同时向上移动,直到两个结点相同,这样便找到了父节点.这个算法时间复杂度为O(N). 代码实现: #include<iostream> struct Node { int data; Node* left; Node* right; Node* parent; Node() :left(NULL), right(NULL), pare