1. 程式人生 > >演算法提高 分分鐘的碎碎念

演算法提高 分分鐘的碎碎念

問題描述

  以前有個孩子,他分分鐘都在碎碎念。不過,他的念頭之間是有因果關係的。他會在本子裡記錄每一個念頭,並用箭頭畫出這個念頭的來源於之前的哪一個念頭。翻開這個本子,你一定會被互相穿梭的箭頭給攪暈,現在他希望你用程式計算出這些念頭中最長的一條因果鏈。   將念頭從1到n編號,念頭i來源於念頭from[i],保證from[i]<i,from[i]=0表示該念頭沒有來源念頭,只是腦袋一抽,靈光一現。

輸入格式

  第一行一個正整數n表示念頭的數量   接下來n行依次給出from[1],from[2],…,from[n]

輸出格式

  共一行,一個正整數L表示最長的念頭因果鏈中的念頭數量

樣例輸入

8 0 1 0 3 2 4 2 4

樣例輸出

3

樣例說明

  最長的因果鏈有:   1->2->5 (from[5]=2,from[2]=1,from[1]=0)   1->2->7 (from[7]=2,from[2]=1,from[1]=0)   3->4->6 (from[6]=4,from[4]=3,from[3]=0)   3->4->8 (from[8]=4,from[4]=3,from[3]=0)

資料規模和約定

  1<=n<=1000

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
    int n, sum=0, a[1001], i, tmp, max=-1, t;

    cin >> n;
    
    for(i=1;i<=n;i++)
        cin>>a[i];
    for(i=1;i<=n;i++)
    {
        tmp=i;
        sum=1;
        while(a[tmp]<tmp && a[tmp]!=0)
        {
            sum++;
            tmp=a[tmp];
        }
        if(max < sum)
            max = sum;
    }
    cout << max << endl;

    return 0;
}