題目分析:
關鍵在於搞清楚乙個基本情況:
隨便選乙個節點作為根節點,其各個子樹的深度中最大的兩個就組成了這個樹的最大深度。
因此我們最簡單的思路就是對樹的每個子樹進行一次求深度操作,同時記錄最深根,然後找最深的兩個子樹就可以了。這樣至少要對所有子樹各進行一次操作。
可以更加簡潔,我們先對整個樹進行一次求深度操作,這個時候我們求出來的所有最深點所在的子樹都被遍歷完了。
假如這些點分別屬於不同的子樹,那麼肯定就已經確定了所有的點;
這樣的話我們把兩種情況統一處理,在第一次求深度確定的點中隨便找乙個點作為根節點再次進行深搜,確定的新點要麼和原來一樣,要麼全是新點,把兩個集合取並集(去重)即可。
**:
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
10050
;int n;
vector<
int> m[maxn]
;int vis1[maxn]
,vis2[maxn]
;vector<
int> res1,res2;
int max1 =0;
void
dfs1
(int root)}}
void
dfs2
(int root,
int pos)
}// 假如是葉節點if(
!***)
else
if(pos == max1)}}
intmain()
int cnt =0;
for(
int i =
1;i <= n;i++)}
if(cnt!=
1) cout<<
"error: "
<" components"
}}
55ms
c++ set給vector去重並自動排序
set自帶去重和排序功能:
vector<
int> v;
set<
int>
s(v.
begin()
,v.end()
);
這題用鄰接矩陣會爆記憶體 個位數統計pat 1021
給定乙個k位整數n dk 1 10k 1 d1 101 d0 0 di 9,i 0,k 1,dk 1 0 請編寫程式統計每種不同的個位數字出現的次數。例如 給定n 100311,則有2個0,3個1,和1個3。輸入格式 每個輸入包含1個測試用例,即乙個不超過1000位的正整數n。輸出格式 對n中每一種...
PAT1021 個位數統計
時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 給定乙個k位整數n dk 1 10k 1 d1 101 d0 0 di 9,i 0,k 1,dk 1 0 請編寫程式統計每種不同的個位數字出現的次數。例如 給定n 100...
PAT 1021 個位數統計
給定乙個k位整數n dk 1 10k 1 d1 101 d0 0 di 9,i 0,k 1,dk 1 0 請編寫程式統計每種不同的個位數字出現的次數。例如 給定n 100311,則有2個0,3個1,和1個3。輸入格式 每個輸入包含1個測試用例,即乙個不超過1000位的正整數n。輸出格式 對n中每一種...