洛谷P2018 訊息傳遞

2022-04-02 04:22:37 字數 1414 閱讀 9646

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係:a是b的上級,b也是a的上級。

最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,任何乙個已經接到訊息的人,都可以把訊息告訴他的乙個直接上級或者直接下屬。

現在,你想知道:

1.到底需要多長時間,訊息才能傳遍整個巴蜀國的所有人?

2.要使訊息在傳遞過程中消耗的時間最短,可供選擇的人有那些?

輸入格式:

輸入檔案的第一行為乙個整數n(n≤1000),表示巴蜀國人的總數,假如人按照1到n編上了號碼,國王的編號是1。第2行到第n行(共n-1行),每一行乙個整數,第i行的整數表示編號為i的人直接上級的編號。

輸出格式:

檔案輸出共計兩行:

第一行為乙個整數,表示最後乙個人接到訊息的最早時間。

第二行有若干個數,表示可供選擇人的編號,按照編號從小到大的順序輸出,中間用空格分開。

輸入樣例#1:

811

3444

3

輸出樣例#1:

5

3 4 5 6 7

/*

樹形dp

思路:列舉第乙個放的位置,dfs遞迴處理出當前節點u的子節點v需要的傳遞時間,然後從大到小排序,對於傳遞時間長的節點,就先傳遞給它。

*/#include

#include

#include

#include

#define maxn 1010

using

namespace

std;

int ans=0x7fffffff

,an[maxn],dp[maxn],n,num,head[maxn],ans_num;

struct

nodee[maxn*2

];void insert(int

from,int

to)void dfs(int now,int

father)

sort(tmp+1,tmp+cnt+1

);

for(int i=1;i<=cnt;i++)dp[now]=max(dp[now],tmp[i]+cnt-i+1);}

intmain()

for(int i=1;i<=n;i++)

if(ans==dp[i])an[++ans_num]=i;

}printf(

"%d\n

",ans+1

);

for(int i=1;i<=ans_num;i++)printf("

%d "

,an[i]);

return0;

}

洛谷P2018 訊息傳遞

由題意得這是一棵樹,而任何乙個已經接到訊息的人,都可以把訊息告訴他的乙個直接上級或者直接下屬,說明是一棵無根樹。本來以為要用什麼高階樹上演算法亂搞,結果發現 n leq 1000 這不是dfs就能水過嗎?實際上是個樹規 欽定乙個結點為根,我們在有根樹上做樹規。對於結點 x 他的狀態由他的子結點決定。...

洛谷 P2018 訊息傳遞 題解

題面 總體來說是一道從下往上的dp 貪心 設f i 表示將訊息傳給i,i的子樹全部接收到所能消耗的最小時間 那麼對於i的所有親兒子節點j,我們會貪心地先給f j 大的人傳遞,然後次大.可以證明,這樣的答案一定是最優的 然後f i max f i f j cnt 總的時間複雜度是o n 2logn 可...

洛谷 P2018 訊息傳遞 樹形dp 貪心

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...