TIOJ[1152] 1.銀河帝國旅行社
題目連結:https://tioj.ck.tp.edu.tw/problems/1152
"樹直徑"定義:一顆樹上任兩點距離最大
這是一題裸裸的樹直徑題,不難發現dfs一次找到最遠點,再用那個點當作第二次dfs的根,再找一次最遠點,不外乎就是樹直徑(很greedy的想法(?)。
PS:我的code超爛,ranklist超後面QAQ
"樹直徑"定義:一顆樹上任兩點距離最大
這是一題裸裸的樹直徑題,不難發現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; }
留言
張貼留言