luogu2016:战略游戏:求最大独立集(板子)

题目连接

  • 树形DP专题

题目大意

  • 给出一棵树,每个守卫可以瞭望相邻的点;
  • 问,最少需要多少个守卫,可以瞭望全图。

题目分析

  • 瞭望:其实是希望用最少的点,覆盖长度范围为1的图。
  • 所以是经典的“最小点覆盖”问题,在树上也叫“最大独立集”问题;
  • 因为是板子,所以肯定很简单,直接上代码,相信应该问题不大。

解题流程


参考代码

//1.3-luogu2016-战略游戏
//最小点覆盖 
#include
using namespace std;
const int N=3000007;
struct node{
	int nex,to;
}e[N];
int n,f[1501][2];

int las[N],cnt;
void add(int x,int y){
	cnt++;
	e[cnt].nex=las[x];
	e[cnt].to=y;
	las[x]=cnt;
}
void dfs(int x,int fa){
	f[x][1]=1;
	f[x][0]=0;
	for(int i=las[x];i;i=e[i].nex){
		int y=e[i].to;
		if(y==fa) continue;
		dfs(y,x);
		f[x][0]+=f[y][1];               //如果x不放,y一定要放 
		f[x][1]+=min(f[y][1],f[y][0]);  //如果x  放,y可放可不放 
	}
}

int main(){
	cin >> n;
	while(n--){          //构图 
		int x,k,y;
		cin >> x >> k;
		while(k--){
			cin>>y; add(x,y); add(y,x);
		}
	}
	dfs(0,-1);           //从0号点出发 
	cout << min(f[0][1],f[0][0]);
	return 0;
} 


你可能感兴趣的:(树形DP,动态规划,题解)