7 10 小字輩 25分

2021-10-09 09:14:59 字數 2301 閱讀 8048

本題給定乙個龐大家族的家譜,要請你給出最小一輩的名單。

輸入格式:

輸入在第一行給出家族人口總數 n(不超過 100 000 的正整數) —— 簡單起見,我們把家族成員從 1 到 n 編號。隨後第二行給出 n 個編號,其中第 i 個編號對應第 i 位成員的父/母。家譜中輩分最高的老祖宗對應的父/母編號為 -1。一行中的數字間以空格分隔。

輸出格式:

首先輸出最小的輩分(老祖宗的輩分為 1,以下逐級遞增)。然後在第二行按遞增順序輸出輩分最小的成員的編號。編號間以乙個空格分隔,行首尾不得有多餘空格

輸入樣例:

92 6 5 5 -1 5 6 4 7

輸出樣例:

41 9

我先說一下一開始超時的演算法吧,用了dp的思想,降低了一些複雜度,但是,沒用,依然超時。

#include

using

namespace std;

int a[

100010

],b[

100010

],c[

100010];

int n,ma=0;

intf

(int i)

intmain()

for(i=

1;i<=n;i++)}

printf

("%d\n"

,ma)

;for

(i=1

;i<=n;i++)}

top--

;for

(i=1

;i)printf

("%d "

,c[i]);

printf

("%d\n"

,c[top]);

return0;

}

後面的**時抄的,用的bfs,

他在一開始儲存資料的方式就和我不一樣。

牛呀!原部落格位址

#include

using

namespace std;

int n,t,mx,f,lzz,bfe[

100005];

vector <

int> vec[

100005];

/* vector 動態陣列。

這是乙個二維陣列,它的第一維大小是固定的100005,第二維是動態的。

vec[i].size(),返回這個以為陣列的大小,即元素個數

queue, 佇列,queueq;

q.push(tiem) 把item放進佇列

q.front() 返回隊首元素,但不會刪除

q.pop() 刪除隊首元素

q.back() 返回隊尾元素

q.size() 返回元素個數

q.empty() 檢查佇列是否為空

*//* vec,這裡用於儲存它孩子的編號。

bef,用於儲存他自己的輩分,就是第幾輩

*/void

bfs(

int id)

}return;}

intmain()

else

}bfs

(lzz)

; f =0;

cout << mx << endl;

for(

int i =

1;i <= n;i++

)else}}

cout << endl;

return0;

}

感謝大佬給的第一段**修改版!

#include

using

namespace std;

int a[

100010

],b[

100010

],c[

100010];

/* a[i],儲存原始資料,即i個節點的直系祖輩。

b[i],記錄它是第幾輩

c[i],儲存最小輩的編號

*/int n,ma=0;

intf

(int i)

intmain()

} top--

;for

(i=1

;i)printf

("%d "

,c[i]);

printf

("%d\n"

,c[top]);

return0;

}

7 11 小字輩 25分

東軟學習小組成員 夜楓 本題給定乙個龐大家族的家譜,要請你給出最小一輩的名單。輸入格式 輸入在第一行給出家族人口總數 n 不超過 100 000 的正整數 簡單起見,我們把家族成員從 1 到 n 編號。隨後第二行給出 n 個編號,其中第 i 個編號對應第 i 位成員的父 母。家譜中輩分最高的老祖宗對...

7 3 小字輩 25分

本題給定乙個龐大家族的家譜,要請你給出最小一輩的名單。輸入格式 輸入在第一行給出家族人口總數 n 不超過 100 000 的正整數 簡單起見,我們把家族成員從 1 到 n 編號。隨後第二行給出 n 個編號,其中第 i 個編號對應第 i 位成員的父 母。家譜中輩分最高的老祖宗對應的父 母編號為 1。一...

7 11 小字輩 25分

東軟學習小組成員 夜楓 本題給定乙個龐大家族的家譜,要請你給出最小一輩的名單。輸入格式 輸入在第一行給出家族人口總數 n 不超過 100 000 的正整數 簡單起見,我們把家族成員從 1 到 n 編號。隨後第二行給出 n 個編號,其中第 i 個編號對應第 i 位成員的父 母。家譜中輩分最高的老祖宗對...