洛谷P2018 訊息傳遞

2022-04-14 01:54:25 字數 968 閱讀 9360

由題意得這是一棵樹,而任何乙個已經接到訊息的人,都可以把訊息告訴他的乙個直接上級或者直接下屬,說明是一棵無根樹。

本來以為要用什麼高階樹上演算法亂搞,結果發現\(n\leq 1000\),這不是dfs就能水過嗎?(實際上是個樹規)

欽定乙個結點為根,我們在有根樹上做樹規。對於結點\(x\),他的狀態由他的子結點決定。簡單思考一下可以發現,最優決策一定是先告訴耗時長的子結點。轉移方程不太好寫,直接看**吧。

int dfs(int x)

sort(tmp+1,tmp+num+1);

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

return dp[x];

}

這就是最核心的部分。

做了\(n\)次dfs,而每一次的複雜度最壞是\(nlogn\),總時間複雜度\(n^2logn\),完全沒有問題。

">#include#include#include#include#define inf 0x3f3f3f3f

#define maxn 1010

using namespace std;

int to[maxn<<1],fst[maxn],nxt[maxn<<1],cnt=0,t[maxn],dp[maxn],book[maxn];

void add(int x,int y)

int dfs(int x)

sort(tmp+1,tmp+num+1);

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

return dp[x];

}int main()

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

printf("%d\n",ans);

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

if(t[i]==ans) printf("%d ",i);

system("pause");

return 0;

}

洛谷P2018 訊息傳遞

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

洛谷 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單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...