沒有上司的舞會

2022-04-02 13:22:23 字數 1156 閱讀 5498

首先我們可以由題意可知,這是一棵樹,同時如果作為兒子節點去了舞會,那就說明父親節點是不會去的;

作為一名職員是否願意參加只跟他的直接上司有關係,所以我們在設狀態的時候就可以多開一維來表示是否參加,也就是說樹上的節點儲存兩個資訊,第乙個就是該職員去參加舞會的最大值,第二個就是該職員不去參加舞會的最大值。所以狀態也就是 \(f_\)表示該節點的員工去參加的最大值,\(f_\)表示不去;

\(f_=\)

\(\sum\limits_ max(f_,f_)\)意為這個不去的時候,他的兒子有兩個選擇,分別對應著去或者不去,取\(max\)

\(f_=r_i+\sum\limits_ f_\)意為這個節點去的話,那麼他的所有兒子都不能去,他的快樂值和他兒子不能去的最大值的 \(\sum\)即為\(ans\)

首先我們肯定是建樹,在建樹的時候我們要記錄一下每乙個節點是否有父親,然後求出根節點,因為題目沒保證說是節點\(1\)就是校長,同時建樹的時候建的樹為乙個反向有向圖,題目給定\(a \to b\)表示 \(a\)是\(b\)的上司,我們在更新的時候,更新的順序是從兒子更新父親,所以應該要反過來更新,如果是雙向邊,先保證不能走回去,不讓將會一直更新;

#include #include #include #include #include using namespace std;

const int maxn=1e6;

struct edge

edge[maxn<<1];

inline int read()

while(isdigit(ch))

return x*f;

}int number_edge,head[maxn<<1];

void add_edge(int from,int to)

int n;

int f[maxn][2];

int vis[maxn];

void dp(int x)

}signed main()

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

int root;

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

dp(root);

printf("%d",max(f[root][0],f[root][1]));

return 0;

}

沒有上司的舞會

題目描述 description ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。輸入描述 input descri...

沒有上司的舞會

ural大學有 n 個職員,編號為 1 n 他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。第一行乙個整數n。1 n 6000 接下來n行,第i 1行表示...

沒有上司的舞會

某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請...