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
5
1
2
2
2
4
1
2
3
EOF
Sample Output
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;
}