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