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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章