1. 程式人生 > >遊歷魔法王國_2018網易校招

遊歷魔法王國_2018網易校招

遊歷魔法王國

時間限制:1秒

空間限制:32768K

魔法王國一共有n個城市,編號為0~n-1號,n個城市之間的道路連線起來恰好構成一棵樹。
小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的一個城市,小易最多能行動L次。
如果小易到達過某個城市就視為小易遊歷過這個城市了,小易現在要制定好的旅遊計劃使他能遊歷最多的城市,請你幫他計算一下他最多能遊歷過多少個城市(注意0號城市已經遊歷了,遊歷過的城市不重複計算)。 
輸入描述:
輸入包括兩行,第一行包括兩個正整數n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市個數和小易能行動的次數。
第二行包括n-1個整數parent[i](0 ≤ parent[i] ≤ i), 對於每個合法的i(0 ≤ i ≤ n - 2),在(i+1)號城市和parent[i]間有一條道路連線。


輸出描述:
輸出一個整數,表示小易最多能遊歷的城市數量。

輸入例子1:
5 2
0 1 2 3

輸出例子1:
3

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;

void traversal(int n,int L,vector<int> &parent)
{
    int maxlen=0;
    vector<int>dp(n);
    for(int i=0;i<n-1;i++)
    {
        dp[i+1]=dp[parent[i]]+1;
        maxlen=max(maxlen,dp[i+1]);
    }
    int ans=min(maxlen,L);
    cout<<min(n,1+ans+(L-ans)/2);
}
int main()
{
    int n,L;
    cin>>n>>L;
    vector<int>parent;
    int x;
    for(int i=0;i<n-1;i++)
    {
        cin>>x;
        parent.push_back(x);
    }
    traversal(n,L,parent);
}