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 }

浙公网安备 33010602011771号