现在有一颗合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度。
分析:输入n个顶点,n-1条边,如果是完全合法的输入,那就简单的有向图,找入度为0的节点,然后广搜或者深搜(深搜代码简单),得到最大的深度就是树的高度。
但是:只过了70%的测试用例,我实在想不出来还有什么情况,1000的数据范围肯定不会超时,我怀疑是否存在非法输入,比如一个节点有超过2个节点的儿子。如果你知道,希望告知一下,谢谢!
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e3 + 10; 14 vector<int> e[maxn]; 15 int n; 16 int res; 17 void dfs(int u, int d) { 18 res = max(res, d); 19 for (auto x : e[u]) { 20 dfs(x, d + 1); 21 } 22 } 23 int du[maxn]; 24 void solve() { 25 cin >> n; 26 int x, y; 27 for (int i = 0; i < n - 1; i++) { 28 cin >> x >> y; 29 e[x].push_back(y); 30 du[y]++; 31 } 32 for (int i = 0; i < n; i++) { 33 if(du[i] == 0) 34 dfs(i, 1); 35 } 36 cout << res << endl; 37 38 } 39 int main() { 40 freopen("test.in", "r", stdin); 41 //freopen("test.out", "w", stdout); 42 solve(); 43 return 0; 44 }