沒有上司的舞會

2022-02-04 18:12:08 字數 1394 閱讀 6203

沒有上司的舞會

有一棵有n個點n-1條邊的有根樹,給出點權,要從中選出若干個點,保證其中任何兩個點不再同一條邊的端點上,求點權之和的最大值,\(1<=n<=6000\)。

本題樹已經給出根,但是一定要有意識對於樹的問題,轉換成有根樹,尤其是二叉樹,可以大大簡化問題。

本題顯然為樹形遞推題,必然要表現節點這一狀態,並且還有不能在同一邊上的限制,於是設\(f[x][0/1]\)分別表示以x為根節點的子樹中x選和不選的最大點權紙和,設\(x_i\)為x的第i個兒子,因此不難有

\[f[x][0]=\sum_^\max(f[x_i][0],f[x_i][1])

\]\[f[x][1]=\sum_^f[x_i][0]

\]邊界:\(f[i][0]=\)對應點權,i為葉子節點編號,其餘為0.

答案:\(max(f[r][0],f[r][1])\),r為根節點

dfs

#include #include #define il inline

#define ri register

using namespace std;

struct point*head[6001],*pt;

int h[6001],dp[6001][2],in[6001];

il int max(int,int);

il void read(int&),link(int,int),dfs(int);

int main()

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

return 0;

}il int max(int a,int b)

il void dfs(int a)

il void link(int u,int v)

il void read(int &x)

bfs

#include #include #include #define il inline

#define ri register

using namespace std;

queuet;

int h[6001],dp[6001][2],in[6001],

n,pa[6001];

il void read(int&);

il int max(int,int),dag();

int main()

il int dag()int root;for(root=1;root<=n;++root)if(!pa[root])break;

return max(dp[root][0],dp[root][1]);

}il int max(int a,int b)

il void read(int &x)

沒有上司的舞會

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

沒有上司的舞會

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

沒有上司的舞會

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