hihocoder_offer收割编程练习赛53_1继承顺位

题目链接: https://hihocoder.com/contest/offers53/problem/1

解题思路: 仔细阅读继承的规则,对照样例,就可以看出是一个前序遍历, 但是需要根据时间顺序指定遍历子节点的顺序,存储的时候按顺序存就可以了。然后把dead的人删掉。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 const int imax_n = 100005;
  5 
  6 struct Edge
  7 {
  8     int u, v;
  9     Edge()
 10     {
 11 
 12     }
 13 };
 14 
 15 map<string, int> mp;
 16 map<int, string> names;
 17 int dead[imax_n];
 18 string king_name;
 19 int cnt_name;
 20 int n;
 21 
 22 int head[imax_n];
 23 Edge edge[imax_n];
 24 int next_edge[imax_n];
 25 int cnt;
 26 
 27 
 28 
 29 void init()
 30 {
 31     memset(head, -1, sizeof(head));
 32     memset(next_edge, -1, sizeof(next_edge));
 33     memset(dead, 0, sizeof(dead));
 34     cnt = 0;
 35     mp.clear();
 36     names.clear();
 37     cnt_name = 0;
 38 }
 39 
 40 void addEdge(int u, int v)
 41 {
 42     edge[cnt].u = u;
 43     edge[cnt].v = v;
 44     next_edge[cnt] = head[u];
 45     head[u] = cnt++;
 46 }
 47 
 48 void dfs(int u)
 49 {
 50     if (dead[u] == 0 && names[u] != king_name)
 51     {
 52         cout<<names[u]<<endl;
 53     }
 54     stack<int> S;
 55     for (int i = head[u]; i != -1; i = next_edge[i])
 56     {
 57         S.push(edge[i].v);
 58     }
 59     while (!S.empty())
 60     {
 61         int v = S.top();
 62         S.pop();
 63         dfs(v);
 64     }
 65 }
 66 
 67 int main()
 68 {
 69     init();
 70     scanf("%d", &n);
 71     cin>>king_name;
 72     mp[king_name] = 1;
 73     names[1] = king_name;
 74     cnt_name = 2;
 75     string op, father, son;
 76     int u, v;
 77     for (int i = 0; i < n; ++i)
 78     {
 79         cin>>op;
 80         if (op.compare("birth") == 0)
 81             cin>>father>>son;
 82         else
 83         {
 84             cin>>father;
 85             dead[mp[father]] = 1;
 86             continue;
 87         }
 88         if (mp.find(father)==mp.end())
 89         {
 90             mp[father] = cnt_name;
 91             names[cnt_name++] = father;
 92         }
 93         if (mp.find(son) == mp.end())
 94         {
 95             mp[son] = cnt_name;
 96             names[cnt_name++] = son;
 97         }
 98         u = mp[father];
 99         v = mp[son];
100         addEdge(u, v);
101     }
102     dfs(1);
103     return 0;
104 }

 

posted @ 2018-04-01 18:52  只会一点暴力  阅读(178)  评论(0编辑  收藏  举报