沒有上司的舞會
有一棵有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,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請...