TIOJ[1152] 1.銀河帝國旅行社

題目連結: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;
}

留言

這個網誌中的熱門文章

[ZJ] b229: TOI 2009 第一題:路徑問題

交大資工(APCS組)(面試&心得)

滿是挫傷的ION CAMP