巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果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單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...