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 }


浙公网安备 33010602011771号