題意:公司裡除了老闆,每個人都有乙個直屬上司,要求選盡量多的人,但不能同時選乙個人和他的直屬上司,問最多能選多少個人,以及在人數最多的情況下方案是否唯一。
思路:d[u][0]表示不選u點能得到的最大人數d[u][0]=sum
d[u][1]表示選u點能得到的最大人數d[u][1]=sum
f[u][0]表示不選u點能獲得的最大人數方案是否唯一,1.d[v][0]=d[v][1],不唯一(用1表示不唯一)。2.選擇d[v][0]且f[v][0]=1;選擇d[v][1]且f[v][1]=1。
f[u][1]表示選擇u點能獲得的最大人數方案是否唯一,f[v][0]=1時f[u][1]=1。
dfs
#includeusingnamespace
std;
int d[204][2],f[205][2
];vector
child[205
];void dp(int
u)
int len=child[u].size();
for(int i=0;i)
if(d[a][1]==d[a][0])//
²»î¨ò»
if(d[a][0]1])
d[u][
1]=d[u][1]+d[a][0
];
if(f[a][0]==1)f[u][1]=1
; }
d[u][
1]++;
}int
main()
dp(1);
int flag=0
;
if(d[1][1]>d[1][0])flag=1
; cout
<1][flag]<<'';
if(f[1][flag]==1||d[1][0]==d[1][1])cout<<"no"
yes"
>n; }return0;
}
uva1220 樹的最大獨立集 判重
題意是挑選盡量多的人,並且每個人都不和他的父節點同時出現,很明顯的最大獨立集問題,難點在於如何判斷方案是否唯一。詳情請見劉汝佳 演算法競賽入門經典 第二版 p282 include include include include include include include define inf ...
樹的最大獨立集
include include includeusing namespace std ifstream fin c data19.in struct node int data int c int gc struct node parent struct node left struct node ...
樹的最大獨立集
題意 對於一棵有n個結點的無根樹,選出盡量多的結點,使得任何兩個結點均不相鄰 稱為最大獨立集 sol 樹形dp 由於每個點只由其兒子或者孫子決定 二者的最大值 所以我們可以深搜一遍,回溯的時候用當前節點更新其父親以及父親的父親 因為此時該節點的值已經被我們計算出來了 這種由已知貢獻給未知的方法稱為刷...