演算法提高 分分鐘的碎碎念
阿新 • • 發佈:2018-12-11
問題描述
以前有個孩子,他分分鐘都在碎碎念。不過,他的念頭之間是有因果關係的。他會在本子裡記錄每一個念頭,並用箭頭畫出這個念頭的來源於之前的哪一個念頭。翻開這個本子,你一定會被互相穿梭的箭頭給攪暈,現在他希望你用程式計算出這些念頭中最長的一條因果鏈。 將念頭從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; }