sgu 449 树的遍历

题意:  给出了处于第i层的树的每个子树中的一个叶子节点。现在想遍历这棵树,前提是标号小的的要尽可能放在前方。

思路:  这道题就是直接把图书建出来, 用vector存边,这样的话容易排序, 然后搜索一边就行了。

AC代码:

View Code
  1 #include <iostream>
  2 #include <algorithm>
  3 #include <vector>
  4 #include <string>
  5 #include <cstring>
  6 #include <map>
  7 #include <cstdio>
  8 using namespace std;
  9 const int N = 101000;
 10 
 11 struct node
 12  {
 13      int id, key;
 14      node(int a=0, int b=0)
 15       {
 16           id = a;
 17           key = b;
 18       }
 19      friend bool operator < (node A, node B)
 20       {
 21           return A.key < B.key;
 22       }
 23  }p[N*4];
 24 
 25 vector<node>g[2*N];
 26 vector<int>y[2*N];
 27 map<int,int>mp;
 28 int a[N], n, m, q, f[4*N], b[2*N];
 29 int ans[N*4], step;
 30 
 31 void init()
 32  {
 33      int u, v, k, tp;
 34      mp.clear();
 35      for(int i=0; i<N; i++)
 36       {
 37           y[i].clear();
 38           g[i].clear();
 39       }
 40      tp = 1;
 41      for(int i=1; i<=m; i++)
 42       {
 43          scanf("%d", &u);
 44          mp[u] = tp;
 45          scanf("%d", &k);
 46          while(k--)
 47           {
 48               scanf("%d", &v);
 49               y[tp].push_back(v);
 50           }
 51           tp++;
 52       }
 53      mp[0] = tp;
 54      for(int i=1; i<=n; i++)
 55       y[tp].push_back(i);
 56      m++;
 57      tp = m;
 58      for(map<int,int>::iterator it=mp.begin(); it!=mp.end(); it++)
 59       {
 60         a[tp--] = it->second;
 61       }
 62  }
 63 
 64 int find(int u)
 65  {
 66      if(f[u] != u)
 67       f[u] = find(f[u]);
 68      return f[u];
 69  }
 70 
 71 void dfs(int u)
 72  {
 73      node tp;
 74      if(g[u].size() == 0)
 75       {
 76           ans[step++] = p[u].key;
 77           return ;
 78       }
 79      for(int i=0; i<g[u].size(); i++)
 80       {
 81           dfs(g[u][i].id);
 82       }
 83  }
 84 
 85 void solve()
 86  {
 87      int u, v, k;
 88      for(int i=1; i<=n; i++)
 89       {
 90           p[i].id = i;
 91           p[i].key = i;
 92       }
 93      for(int i=1; i<=3*n; i++)
 94       f[i] = i;
 95      for(int i=1; i<=m; i++)
 96       {
 97           u = a[i];
 98           for(int j=0; j<y[u].size(); j++)
 99            {
100                b[j] = find(y[u][j]);
101            }
102            sort(b, b+y[u].size());
103           k = unique(b,b+y[u].size()) - b;
104           n++;
105           p[n].id = n;
106           p[n].key = n;
107           for(int j=0; j<k; j++)
108            {
109                v = b[j];
110                f[v] = n;
111                p[n].key = min(p[n].key, p[v].key);
112                g[n].push_back(node(v,p[v].key));
113            }
114       }
115      for(int i=1; i<=n; i++)
116      {
117          sort(g[i].begin(), g[i].end());
118      }
119      step = 1;
120      dfs(n);
121      while(q--)
122       {
123           scanf("%d", &u);
124           printf("%d\n", ans[u]);
125       }
126  }
127 
128 int main()
129  {
130      while(scanf("%d%d%d", &n, &m, &q) != EOF)
131       {
132           init();
133           solve();
134       }
135      return 0;
136  }

 

 

posted @ 2012-10-07 19:47  Gu Feiyang  阅读(181)  评论(0)    收藏  举报