您的位置:首页 > 其它

UVALive2038(树形dp)

2016-08-12 20:09 459 查看
链接:点击打开链接

题意:给出一棵树,求在节点上最少放几个灯,使得所有边都被覆盖

代码:

#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[2005][2],vis[2005];
vector<int> G[2005];
void dfs(int s){                                //dp[i][j]表示i点事否放灯
int i,tmp;
vis[s]=1;
dp[s][0]=0;
dp[s][1]=1;
for(i=0;i<G[s].size();i++){
tmp=G[s][i];
if(vis[tmp])
continue;
dfs(tmp);
dp[s][0]+=dp[tmp][1];                   //父节点不放子节点必须放
dp[s][1]+=min(dp[tmp][1],dp[tmp][0]);   //父节点放子节点可以不放
}
}
int main(){
int n,i,j,x,y,num;
while(scanf("%d",&n)!=EOF){
for(i=0;i<=n;i++)
G[i].clear();
for(i=0;i<n;i++){
scanf("%d:(%d)",&x,&num);
while(num--){
scanf("%d",&y);
G[x].push_back(y);
G[y].push_back(x);
}
}
memset(vis,0,sizeof(vis));
dfs(0);
printf("%d\n",min(dp[0][0],dp[0][1]));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: