树的最大独立集
树的最大独立集被定义为:对于一棵n个结点的无根树,选出尽量多的结点,使得任意两个结点均不相邻。
输入数据:
- 结点数N
- 无向边N-1条
输出数据:
- 树的最大独立集为哪些点
用d[i]
表示以i
为根节点的子树的最大独立集大小。
那么对于结点i有两种策略:选和不选。
- 若选结点i,那么结点i的儿子就不能选了,只能选结点i的孙子。
- 若不选结点i,那么结点i的儿子就可以选。
d[i] = max(1 + sum(d[j]),sum(d[k]));
//结点j为结点i的孙子集合
//结点k为结点i的儿子集合
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
/*
11
0 1
1 2
2 3
2 4
2 5
3 6
3 7
4 8
4 9
5 10
*/
const int maxn=1000;
const int INF=1e9;
vector<