NTHU OJ 10958 - 樹的最長路徑

Link: http://acm.cs.nthu.edu.tw/problem/10958/

Description

樹的最長路徑

题目内容:
給定一顆無根樹,請找出他最長路徑的長度

 

Input

輸入第一行為一個數字T,代表測資的筆數。
接下來會有T筆測資,每一筆測資第一行有一個數字N
接下來有N-1行,這N-1行的第 i 行一個數字ai表示: i+1 與 ai 相連 (ai < i)

 

T < 100
0 < N <= 1000

Output

一行一個數字為最長路徑的長度

Sample Input

2
5
1
2
2
2
4
1
2
3

EOF

Sample Output

2
3

EOF

Code

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

int node[1005];//储存节点的广搜序号
int n;//储存节点数目
int bfs(vector < vector <int> > &relation,queue <int> &pace_queue,int &succeed)//relation代表了第i个节点全部相连的节点,pace_queue储存广搜放入的节点,succeed代表成功插入队列pace_queue的数目
{
    int poped;
    if(succeed==n)
    {
        while(!pace_queue.empty())
        {
            poped=pace_queue.front();
            pace_queue.pop();
        }
        return node[poped];
    }
    poped=pace_queue.front();
    pace_queue.pop();
    for(vector <int> ::iterator iter=relation[poped].begin();iter!=relation[poped].end();iter++)
    {
        if(!node[*iter])
        {
            node[*iter]=node[poped]+1;
            pace_queue.push(*iter);
            succeed++;
        }
    }
    return bfs(relation,pace_queue,succeed);
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        vector < vector <int> > relation(n+1);
        int node1;
        for(int i=1;i<n;i++)
        {
            cin>>node1;
            relation[node1].push_back(i+1);
            relation[i+1].push_back(node1);
        }
        queue <int> root_queue;
        for(int i=1;i<=n;i++)
        {
            if(relation[i].size()<2)
                root_queue.push(i);
        }
        queue <int> pace_queue;
        int _max=0;
        int ans=_max;
        int succeed;
        while(!root_queue.empty())
        {
            node1=root_queue.front();
            root_queue.pop();
            pace_queue.push(node1);
            memset(node,0,sizeof(node));
            node[node1]=1;
            succeed=1;
            _max=bfs(relation,pace_queue,succeed);
            if(_max>ans)
                ans=_max;
        }
        cout<<ans-1<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值