題面
總體來說是一道從下往上的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單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...