首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HDU ACM 1054 Strategic Game 二分图最小顶点覆盖?树形DP「建议收藏」

HDU ACM 1054 Strategic Game 二分图最小顶点覆盖?树形DP「建议收藏」

作者头像
全栈程序员站长
发布2022-07-07 18:59:19
发布2022-07-07 18:59:19
5510
举报

大家好,又见面了,我是全栈君。

分析:这里使用树形DP做。

1、最小顶点覆盖做法:最小顶点覆盖 == 最大匹配(双向图)/2。

2、树形DP: dp[i][0]表示i为根节点,而且该节点不放,所需的最少的点数。 dp[i][1]表示i为根节点,而且该节点放,所须要的最少的点数。

dp[i][0]=sum(dp[son[i][j]][1]) 该点不放。则它的儿子节点必须都放,仅仅有这样之间的边才干够被覆盖。 dp[i][1]=sum(min(dp[son[i][j]][0],dp[son[i][j]][1])) 该点放的话,则它的儿子节点有两种决策。放或不放,取min就可以。

代码语言:javascript
复制
#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;

#define N 1505
int dp[N][2];    //dp[i]表示以i为根节点时所须要的最小点数
int f[N];        //用来记录父节点
vector<int> son[N]; //记录儿子节点

int min(int x,int y)
{
	return x<y?x:y;}int dfs(int pos,int v){	int sum,i;	if(dp[pos][v]!=INT_MIN)		return dp[pos][v];	sum=v;	for(i=0;i<son[pos].size();i++)		if(v==1)                    //当前节点选			sum+=min(dfs(son[pos][i],0),dfs(son[pos][i],1));		else			sum+=dfs(son[pos][i],1);//当前节点不选,子节点必选	dp[pos][v]=sum;	return sum;}int main(){	int ans,n,i,x,m,j,t;	while(scanf("%d",&n)==1)	{		for(i=0;i<n;i++)		{			son[i].clear();			f[i]=i;			dp[i][0]=dp[i][1]=INT_MIN;		}		for(i=0;i<n;i++)		{			scanf("%d:(%d)",&x,&m);			for(j=0;j<m;j++)			{				scanf("%d",&t);				son[x].push_back(t);				f[t]=x;			}		}		for(i=0;i<n;i++)			if(f[i]==i)    //找到根节点			{				ans=min(dfs(i,0),dfs(i,1));				break;			}		printf("%d\n",ans);	}    return 0;}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116417.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档