luogu P2018 訊息傳遞

2022-03-27 07:14:14 字數 2572 閱讀 3026

2017-09-13

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果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

原本一看這個題,暴力找重心,然後跑樹,然後經過仔細讀題,發現並沒有用到重心,我們只要找到乙個點到樹的最長的一條帶邊權的路徑和最大的最小。

f每乙個點上的邊權是從1到所連邊個數的全排列,(因為每一次只能傳乙個)所以我們貪心選取使邊權的大值對應它所連點底下邊權和較小的值.

每一層強行sort加權.ans統計最小

#include#include

#include

#include

#include

#include

#define ll long long

#define _ =read();

using

namespace

std;

const

int maxn=1000+100

;int

read()

while('0'

<=ch&&ch<='9')

return an*f;

}vector

b[maxn];

bool

vis[maxn];

intwi[maxn],n;

int f[maxn],ans[maxn],mi=(int

)1e9;

bool saber(int x,int

y)void dfs(int

x) }

sort(b[x].begin(),b[x].end(),saber);

for(int i=0;i)

vis[x]=0;}

intmain()

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

cout

for(int i=1;i<=n;i++)if(ans[i]==mi)cout

return0;

}

view code

by:s_a_b_e_r

一開始同以為是找重心,然後各種不會做……

後來看題解發現思路很神奇……

因為一單位時間每人只能傳給乙個人,所以這個人周圍的節點是依次接到資訊的

於是可以給它周圍的節點分配乙個邊權

子樹越大的節點越要先傳遞,邊權就越小

所以列舉一遍從哪個點開始向四周傳資訊

最後統計最小值以及方案就可以了

#include#include

#include

#include

#include

using

namespace

std;

const

int n=1009

;int cnt,p[n],n,ans=int

(1e9),an[n],f[n];

bool

vis[n];

struct

edgee[n

<<1

];vector

q[n];

bool cmp(int x,int y)

void add(int u,intv);

p[u]=cnt;

}void dfs(int

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

for(int i=1;i<=q[u].size();++i)

f[u]=max(f[u],q[u][i-1]+i);

}int

main()

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

cout

<1

<

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

if(an[i]==ans)cout

return0;

}

訊息傳遞

by:wypx

s:新機房太棒了

w:突然換機房……幸福來的好突然

luogu P2018 訊息傳遞

一道顯而易見的樹形dp 每個人都有當根節點的機會 然後先告訴需要花費時間長的,再告訴短的 轉移方程 dp u max dp u dp v i 1 include include include using namespace std define maxn 1010 define inf 99999...

P2018 訊息傳遞 dp

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

洛谷P2018 訊息傳遞

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