PAT 1021. Deepest Root (25)

http://www.patest.cn/contests/pat-a-practise/1021

STL慎用啊, 不是超时就是超内存

 

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<map>
  4 #include<set>
  5 #include<queue>
  6 #include<algorithm>
  7 
  8 using namespace std;
  9 
 10 #define MAX(A, B) ((A) > (B) ? (A) : (B))
 11 
 12 typedef vector<int>::size_type ULL;
 13 
 14 const int MAXN = 10000 + 10;
 15 int p[MAXN];
 16 int head[MAXN];
 17 int next_edge[MAXN << 1];
 18 int to[MAXN << 1];
 19 int u[MAXN], v[MAXN];
 20 int n;
 21 
 22 int find(int x) {
 23     return p[x] == x ? x : p[x] = find(p[x]);
 24 }
 25 
 26 int is_tree() {
 27     for (int i = 0; i <= n; ++i) p[i] = i;
 28     for (int i = 0; i < n - 1; ++i) {
 29         int x = find(u[i]);
 30         int y = find(v[i]);
 31         if (x != y) {
 32             p[x] = y;
 33         } 
 34     }
 35     int cnt = 0;
 36     for (int i = 1; i <= n; ++i) {
 37         if(p[i] == i) ++cnt;
 38     }
 39     return cnt;
 40 }
 41 
 42 int now_edge = 0;
 43 void add_edge(int u, int v) {
 44     to[now_edge] = v;
 45     next_edge[now_edge] = head[u];
 46     head[u] = now_edge;
 47     ++now_edge;
 48 }
 49 
 50 void init() {
 51     memset(head, 0xff, sizeof(head));
 52     memset(to, -1, sizeof(to));
 53     now_edge = 0;
 54 }
 55 
 56 int ans[MAXN];
 57 int ans_iter = 0;
 58 int deep[MAXN];
 59 int max_deep = 0;
 60 void dfs(int p, int x, int dep) {
 61     deep[x] = dep;
 62     for (int e = head[x]; e ^ -1; e = next_edge[e]) {
 63         if (p != to[e])
 64             dfs(x, to[e], dep + 1);
 65     }
 66 }
 67 
 68 void printv(const vector<int> &v) {
 69     for (vector<int>::size_type i = 0; i < v.size(); ++i) {
 70         printf("%d\n", v[i]);
 71     }
 72 }
 73 
 74 int is_cal[MAXN];
 75 void push_ans() {
 76     max_deep = *max_element(deep + 1, deep + n + 1);
 77     for (int i = 1; i <= n; ++i) {
 78         if (deep[i] == max_deep && !is_cal[i]) {
 79             is_cal[i] = 1;
 80             ans[ans_iter++] = i;
 81         }
 82     }
 83 }
 84 
 85 void clear_deep() {
 86     max_deep = 0;
 87     memset(is_cal, 0, sizeof(is_cal));
 88 }
 89 
 90 int main() {
 91     init();
 92     scanf("%d", &n);
 93     for (int i = 0; i < n - 1; ++i) {
 94         scanf("%d %d", &u[i], &v[i]);
 95         add_edge(u[i], v[i]);
 96         add_edge(v[i], u[i]);
 97     }
 98     int comp = is_tree();
 99     if (comp != 1) {
100         printf("Error: %d components\n", comp);
101     } else {
102         clear_deep();
103         dfs(-1, 1, 0);
104         push_ans();
105         int sz = ans_iter;
106         for (int i = 0; i < sz; ++i) {
107             dfs(-1, ans[i], 0);
108             push_ans();
109         }
110         sort(ans, ans + ans_iter);
111         for (int i = 0; i < ans_iter; ++i) {
112             printf("%d\n", ans[i]);
113         }
114     }
115     return 0;
116 }

 

posted @ 2015-08-04 13:51  ACSeed  Views(293)  Comments(0)    收藏  举报