Zerojudge b967

Zerojudge b967

題敘

https://zerojudge.tw/ShowProblem?problemid=b967
相當於求樹直徑

想法

可以證明透過兩次DFS即可求解
證明過程可參閱 https://www.itread01.com/content/1549861926.html

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//By Koios1143
#include<bits/stdc++.h>
#define LL long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define pii pair<int,int>
using namespace std;
int n;
pii far;
vector<int> v[100005];
void dfs(int now,int last,int depth){
far = max(far,{depth,now});
for(auto i: v[now]){
if(i==last)
continue;
dfs(i,now,depth+1);
}
}
int main(){
IOS
while(cin>>n){
for(int i=0 ; i<n ; i++){
v[i].clear();
}
for(int i=0,a,b ; i<n-1 ; i++){
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
far = {0,0};
dfs(0,-1,0);
dfs(far.second,-1,0);
cout<<far.first<<"\n";
}
return 0;
}

複雜度

DFS複雜度為 $O(n)$
總複雜度 $O(n)$