hdu 1520-树形dp
来源:互联网 发布:php支付宝支付流程 编辑:程序博客网 时间:2024/06/08 16:34
用了dp和dfs,构建树的方法不熟练,dfs写的也较少
----------------------------------------------------------------------------------------
#include<string.h>
#include<stdio.h>
#define N 6005
#define max(a,b) a>b?a:b
struct node{
int from,to,next;
};
node edges[N*2];
int val[N],tol;
int head[N],degree[N],dp[N][2],visit[N];
int n;
void Add(int a,int b)
{
edges[tol].from=a;edges[tol].to=b;
edges[tol].next=head[a];
head[a]=tol++;
}
void dfs(int x)
{
visit[x]=0;
int ans0,ans1;
int j,u;
ans1=ans0=0;
for(j=head[x];j!=-1;j=edges[j].next)
{
u=edges[j].to;
if(!visit[u]) dfs(u);
ans0+=max(dp[u][1],dp[u][0]);
ans1+=dp[u][0];
}
dp[x][1]=ans1+val[x];
dp[x][0]=ans0;
}
int main()
{
int i,a,b,sum;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++) scanf("%d",&val[i]);
memset(head,-1,sizeof(head));
memset(degree,0,sizeof(degree));
tol=0;
while(scanf("%d%d",&a,&b) && a+b)
{
Add(b,a);
degree[a]++;
}
memset(dp,0,sizeof(dp));
memset(visit,0,sizeof(visit));
sum=0;
for(i=1;i<=n;i++)
{
if(degree[i]==0)
{
dfs(i);
sum+=max(dp[i][0],dp[i][1]);
}
}
printf("%d\n",sum);
}
return 0;
}
- 【树形DP】hdu 1520
- hdu 1520-树形DP
- hdu 1520-树形dp
- hdu 1520 (树形DP)
- hdu 1520 树形DP
- hdu 1520 树形dp
- hdu 1520 (树形)dp
- hdu 1520 树形dp
- HDU 1520 树形dp
- hdu 1520(树形dp)
- HDU 1520 树形dp
- hdu 1520 树形dp入门
- HDU-1520 简单树形dp
- (树形dp) hdu 1520
- hdu 1520 单纯树形dp
- hdu 1520 简单树形dp
- HDU 1520(树形dp)
- hdu 1520 (树形dp)
- 率失真优化RDO 及 RD Cost
- MySQL事务隔离级别详解
- 自助Linux之问题诊断工具strace
- 成功创业者必须具备的9个特质
- d指针在Qt上的应用及实现
- hdu 1520-树形dp
- Memcache的使用和协议分析详解
- 平时项目中应注意的风格要求
- Cocos2d-x之CCImage深入分析
- ubuntu源更新
- 为什么header之前不能有输出
- servlet跳转,界面为何收不到值
- hdu1231-最大连续子序列
- JavaOne2013 开发者大会