P2018 訊息傳遞 dp

2022-04-30 21:24:19 字數 1536 閱讀 5542

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

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

現在,你想知道:

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

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

解析拿到題看錯了,以為是一開始可以告訴任意多個人,然後想了好久都想不出來。。。

如果一開始只告訴乙個人就好辦很多。

分析題目,容易看出對於乙個以\(x\)為根的子樹,其傳播完畢的時間就是其最大子樹(包含節點最多)的節點個數\(+1\)。

設\(dp[x]\)表示一開始把訊息告訴\(x\),傳播完畢的最短時間。

那麼做法就很顯然了,我們考慮狀態轉移。對於節點\(x\),我們遍歷它的所有兒子節點,找出能使得傳播完以\(x\)為根的子樹的最短時間。其實就是找最優情況下的最短時間,顯然,從\(x\)傳播到\(x\)的最大子樹是當前最優情況。

題目中提到,每單位時間乙個人只能告訴另乙個人,而不是多個人。因此最短時間不一定等於最優情況下從\(x\)的最大子樹傳播到\(x\)的時間,但是最優情況下\(x\)一定要最先告訴\(x\)的最大子樹。那麼考慮\(x\)的其它兒子,\(x\)的傳播到這些兒子所需的時間有可能比傳播到\(x\)的最大子樹的時間還要長。

#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define n 1010

#define mod 2520

#define e 1e-12

using namespace std;

inline int read()

while(c>='0'&&c<='9')

return x*f;

}struct recg[n<<1];

int head[n],tot,dp[n],n;

inline void add(int x,int y)

inline int dfs(int x,int fa)

sort(vec.begin(),vec.end());

int len=vec.size(),tmp=0;

for(int i=0;ians;

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

else if(maxx==dp[i])

ans.push_back(i);

} cout

for(int i=0;iprintf("%d ",ans[i]);

return 0;

}

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