数据结构 i_love(我喜欢)

数据结构 i_love(我喜欢)

问题描述

  集训队的学长们都怪怪的,如果 A 学长喜欢 B 学长, A 就会把自己的名字改
成«I_love_<B 学长的名字>»。但是奇怪的学长们很容易移情别恋,他们经常互
相喜欢来喜欢去。现在给出 n 个学长的名字和 m 个喜欢的记录,请你输出编号为
1 的学长最后的名字。


★数据输入
输入第一行为一个正整数 n。
接下来的 n 行,每行有一个学长的名字。(由大小写字母和下划线组成,长
度小于 25)
第 n+2 行为一个正整数 m。
接下来 m 行,每行两个数 u,v。表示编号为 u 的学长喜欢编号为 v 的学长。
(1<=u,v<=n)
80%的数据 1<=n,m<=1000.
100%的数据 1<=n,m<=100000.


★数据输出
输出一个字符串,表示第一个学长最后的名字。

输入示例 输出示例
5
anonymous
natalia
LeBron
Tanya_Romanova
MikeMirzayanov
6
1 2
3 4
2 1
4 3
1 4
3 2
I_love_I_love_I_love_Ta
nya_Romanova


输入示例 输出示例
2
MikhailRubinchik
evol_I
1
1 2
I_love_evol_I


解题思路

  使用like[]数组记录喜欢的人的index,使用height[]数组记录喜欢的层级(有多少个I_love_)

code

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 char names[100002][26];
 5 int like[100002];
 6 int height[100002]={0};
 7 
 8 int main()
 9 {
10 //    freopen("test.txt","r",stdin);
11     int i,j;
12     int num;
13     scanf("%d",&num);
14     getchar();
15     
16     for(i=1;i<=num;i++)
17     {
18         scanf("%s",names[i]);
19         getchar();
20     }
21     
22     int m,a,b;
23     
24     for(i=1;i<=num;i++) like[i]=i;
25     scanf("%d",&m);
26     for(i=0;i<m;i++)
27     {
28         scanf("%d %d",&a,&b);//a like b
29         like[a] = like[b];
30         height[a] = height[b]+1;
31 //        for(j=1;j<=num;j++)    printf("%s
",names[like[j]]);
32     }
33     
34 //    printf("height = %d
",height[1]);
35     for(i=1;i<=height[1];i++) printf("I_love_");
36     printf("%s
",names[like[1]]);
37     
38     return 0;
39 }
原文地址:https://www.cnblogs.com/cbattle/p/7577428.html