題意是挑選盡量多的人,並且每個人都不和他的父節點同時出現,很明顯的最大獨立集問題,難點在於如何判斷方案是否唯一。
詳情請見劉汝佳《演算法競賽入門經典--第二版》p282
#include#include#include
#include
#include
#include
#include
#define inf 1e6
using
namespace
std;
const
int maxn = 205
;char ch[105],fa[105
];char trie[maxn][105
];int
k;int d[maxn][2],f[maxn][2
];vector
g[maxn];
int id(char *s)//給每個字串分配id;
}if(i ==k) strcpy(trie[k],s);
k++;
return k-1;}
int dp(int u,int
x) }
return d[u][1] =sum;
}else
else
if(p >q)
else
if(p }
return d[u][0] =sum;
}}int
main()
//printf("%d\n",g[0].size());
memset(d,-1,sizeof
(d));
dp(0,0);
dp(0,1);
if(d[0][0] > d[0][1
])
else
if(d[0][0] < d[0][1
])
else
for(int i = 0; i < n; ++i) g[i].clear();
}}
uva1220樹的最大獨立集
題意 公司裡除了老闆,每個人都有乙個直屬上司,要求選盡量多的人,但不能同時選乙個人和他的直屬上司,問最多能選多少個人,以及在人數最多的情況下方案是否唯一。思路 d u 0 表示不選u點能得到的最大人數d u 0 sum d u 1 表示選u點能得到的最大人數d u 1 sum f u 0 表示不選u...
樹的最大獨立集
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 由於每個點只由其兒子或者孫子決定 二者的最大值 所以我們可以深搜一遍,回溯的時候用當前節點更新其父親以及父親的父親 因為此時該節點的值已經被我們計算出來了 這種由已知貢獻給未知的方法稱為刷...