題目連結:https://tioj.ck.tp.edu.tw/problems/1152
“樹直徑”定義:一顆樹上任兩點距離最大
這是一題裸裸的樹直徑題,不難發現dfs一次找到最遠點,再用那個點當作第二次dfs的根,再找一次最遠點,不外乎就是樹直徑(很greedy的想法(?)。
PS:我的code超爛,ranklist超後面QAQ
#pragma GCC optimize("O2")
#include<bits/stdc++.h>
#define jizz ios_base::sync_with_stdio(false),cin.tie(NULL)
#define int long long int
#define pb push_back
#define po pop_back
#define F first
#define S second
#define CN cout<<"\n"
#define MAXN 1000005
#define lson int lson=index*2
#define rson int rson=index*2+1
#define mid int mid=(l+r)/2
using namespace std;
vector<int> v[10005];
int vis[10005],ans_p=0,ans_s=0,root;
void init(int n)
{
fill(vis,vis+n,0);
}
void dfs(int now,int sum)
{
for(auto x:v[now])
{
if(vis[x]==0)
{
vis[x]=1;
dfs(x,sum+1);
}
}
if(sum>ans_s)
{
ans_p=now;
ans_s=sum;
//cout << ans_s <<" " << ans_p <<"\n";
}
}
signed main()
{
jizz;
int n,a;
cin >> n;
init(n);
for(int i=0;i<n;i++)
while(cin >> a && a!=-1)
{
v[i].pb(a);
v[a].pb(i);
}
int root=0;
vis[root]=1;
dfs(root,0);
//cout <<"s="<< ans_s <<" p=" << ans_p <<"\n";
init(n);
dfs(ans_p,0);
cout << ans_s <<"\n";
return 0;
}
- 本文連結:https://blog.subarya.me/2019/02/22/TIOJ%201152%20%E9%8A%80%E6%B2%B3%E5%B8%9D%E5%9C%8B%EF%A6%83%EF%A8%88%E7%A4%BE/
- 版權聲明:本Blog所有文章除了特別聲明外,均默認採用 許可之協議。