洛谷 P2018 訊息傳遞 題解

2022-07-13 20:09:12 字數 891 閱讀 2305

題面

總體來說是一道從下往上的dp+貪心;

設f[i]表示將訊息傳給i,i的子樹全部接收到所能消耗的最小時間;

那麼對於i的所有親兒子節點j,我們會貪心地先給f[j]大的人傳遞,然後次大.....

可以證明,這樣的答案一定是最優的;

然後f[i]=max(f[i],f[j]+cnt);

總的時間複雜度是o(n^2logn),可過;

但是還可以進一步優化(窩太懶了所以沒寫)

換根法,可以一遍dfs(nlogn)就求出所有的答案;

#include #define inc(i,a,b) for(register int i=a;i<=b;i++)

using namespace std;

int head[2010],cnt;

class littlestar

}star[4010];

int n;

int f[2010];

class node;

vectorvec[2010];

bool cmp(node x,node y)

void dfs(int u,int fa)

); }

sort(vec[u].begin(),vec[u].end(),cmp);

inc(j,0,(int)vec[u].size()-1)

}int tmp[2010];

int main()

int minn=int_max;

inc(i,1,n)

else if(f[i]==minn)

} printf("%d\n",minn+1);

inc(i,1,tmp[0])}/*

8113

4443

*/

洛谷P2018 訊息傳遞

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

洛谷P2018 訊息傳遞

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

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

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