ACM&找双亲,并查集

题目描述:

    如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。
输入:

    输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
    当n和m为0时结束输入。
输出:

    如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
    具体含义和输出格式参见样例.
样例输入:
3 2
ABC
CDE
EFG
FA
BE
0 0
样例输出:
great-grandparent
-

http://ac.jobdu.com/problem.php?pid=1035

 1 #include <iostream>
 2 #define NUMSIZE 26
 3 using namespace std;
 4
 5 int get_num(char a);
 6 void build_tree(int tree[], int n);
 7 void printf_relation(int tree[], int m);
 8 int get_generation(int tree[], int a, int b);
 9 void print(int gene,string relation);
10
11 int main()
12 {
13     int n,m;
14     int tree[NUMSIZE];
15     for(int i=0; i<NUMSIZE; i++)
16         tree[i] = -1;
17     int t[3]={-1};
18     char c;
19     while(cin>>n && n>0) {
20         cin>>m;
21         build_tree(tree, n);
22         printf_relation(tree, m);
23     }
24     return 0;
25 }
26 int get_num(char a) {
27     if(a==‘-‘)
28         return -1;
29     return a-‘A‘;
30 }
31 void build_tree(int tree[], int n) {
32     int t[3]={-1};
33     char c;
34     for(int i=0; i<n; i++) {
35         for(int j=0; j<3; j++) {
36             cin>>c;
37             t[j]=get_num(c);
38         }
39         if(tree[t[0]] == -1)
40             tree[t[0]] = t[0];
41         if(t[1]!=-1)
42             tree[t[1]] = t[0];
43         if(t[2]!=-1)
44             tree[t[2]] = t[0];
45     }
46 }
47 void printf_relation(int tree[], int m) {
48     int t[2] = {-1};
49     char a,b;
50     for(int i=0; i<m; i++) {
51         int generation;
52         cin>>a>>b;
53         t[0]=get_num(a);
54         t[1]=get_num(b);
55         if((generation=get_generation(tree, t[0], t[1])) !=0)
56             print(generation,"parent");
57         else if((generation=get_generation(tree, t[1], t[0])) !=0)
58             print(generation,"child");
59         else
60             cout<<"-"<<endl;
61     }
62 }
63 int get_generation(int tree[], int a, int b) {
64     int num=0;
65     while(a!=tree[a]){
66         if(tree[a] == b)
67             return ++num;
68         a=tree[a];
69         ++num;
70     }
71     return 0;
72 }
73 void print(int gene, string relation) {
74     switch(gene) {
75         case 1: cout<<relation<<endl;
76                 break;
77         case 2: cout<<"grand"<<relation<<endl;
78                 break;
79         default:
80             for(int i=0; i<gene-2; i++)
81                 cout<<"great-";
82             cout<<"grand"<<relation<<endl;
83     }
84 }

main.cpp



时间: 2024-08-07 17:02:36

ACM&找双亲,并查集的相关文章

HDU ACM 4496 D-City -&gt;并查集+逆向

题意:给定一张图,按照输入的边逐个删除,求每次删除一条边之后图的联通块数量. 分析:反向并查集求联通分量,假设起始各个点都不连通,接着从最后一条边开始添加,如果新加入的边联通了两个联通块,则联通分量减1(保存在数组中),最后正序输出结果即可. #include<iostream> #include<algorithm> using namespace std; int p[10005]; struct EDGE { int x,y; } edge[100005]; int ans[

ACM: 畅通工程-并查集-解题报告

畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &l

hdu--1272--并查集||图的特点

其实 觉得 这个标题 起得不太恰当... 但我又想 并查集 的操作 是形成一颗树的结构 这题的话 是基于图来考虑比较好 因为 是中文 很容易理解题意 而且我一般也不喜欢讲题意 就想随便讲下应该注意和考虑的地方 从我的角度来出发 这题 一开始我的考虑方向是 给出的这些点会不会形成回路 就是成环 如果出现了 那就肯定是NO的 因为 题目要求 任意两点之间 路径的 唯一性 如果 成环 那就会有多条路径的出现了 至于这个是否会成环的判断 不难想到 对于每次输入的x y 通过find操作得到他们各自的 根

ACM:最小生成树,kruskal &amp;&amp; prim,并查集

题目: 输入顶点数目,边的数目,输入每条边的两个顶点编号还有每条边的权值,求最小生成树,输出最小生成树的权值.. 注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图. kruskal----归并边:prim----归并点 方法一:kruskal,克鲁斯卡尔,并查集实现. #include <iostream> #include <algorithm> using name

杭电1272 并查集找环+判断连通

杭电1272 并查集找环+判断连通 E - E Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B

[ACM] POJ 3295 Ubiquitous Religions (并查集)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23093   Accepted: 11379 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路,这条路连接这城市x和y,x所在的集合为A, y所在的集合为B, 可以确定A,B集合内的所有路都比当前这条路的权值大.如果让集合B加入集合A,就是让中心城市位于集合A,那么可以确定这两个集合合并之后的总权值为: A的权值总和+B的数量*当前这条路的权值.同样算出让集合B加入集合A的情况,取两者合并后

[ACM] POJ 1611 The Suspects (并查集,输出第i个人所在集合的总人数)

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21586   Accepted: 10456 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. T

acm集训训练赛(二)D题【并查集】

一.题目 Description There is a town with N citizens. It is known that some pairs of people are friends. According to the famous saying that ?The friends of my friends are my friends, too? it follows that if A and B are friends and B and C are friends th