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

2021-09-29 03:11:03 字數 1506 閱讀 9479

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果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當中較簡單的。意思就是你選乙個人進行訊息傳遞,然後求最少傳遍時間。

由於根不確定,所以要遍歷所有點作為根。

令dp[i]為以i為子樹,訊息傳遍節點i的子樹的所有子樹所需的最小時間。dp[i]取決於花費時間最多的那顆子樹,再加上每1秒的傳播時間,所以先告訴需要花費時間長的,再告訴短的,所以:

dp[i]=max(dp[i],dp[son]+i-1)

其中son為i的子節點,dp[son]+i-1為傳遞時間。

#include #include #include #include #define n 1001

#define inf 2e9+7

using namespace std;

int n,dp[n],head[n],cnt,s[n],a[n],minx(inf);

struct node

e[n<<1];

inline void add(int u,int v)

inline bool cmp(int a,int b)

void dfs(int u,int fa)

; int cnt(0);

register int i;

for(i=head[u];i;i=e[i].nxt)

sort(son+1,son+cnt+1,cmp);//先傳給時間長的

for(i=1;i<=cnt;i++)

dp[u]++;//別忘了1秒的傳遍時間

}signed main()

for(i=1;i<=n;i++)//每個點都可以當一次根節點

cout

}cout

}

洛谷P2018 訊息傳遞

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

洛谷P2018 訊息傳遞

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

樹形dp 貪心思維 訊息傳遞(洛谷 P2018)

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