【DFS】rqnoj P172 圣诞树

题目链接:http://www.rqnoj.cn/Problem_172.html

分析:

对于每个礼物,如果它还连着其他礼物,只能选一个,深搜解决。

具体实现方法:搜索每一个有连线的礼物,在它每一个连着的礼物中选一个价值最大的,递归搜索每一个礼物,如果是叶节点,便直接返回,否则继续搜索。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<climits>
using namespace std;
int l[200][200]={0},s[200]={0},f[200],w[200];
int i,j,k,n,t;
char ch;
void init()
{
   memset(f,-1,sizeof(f));
   scanf("%d",&n); 
   for(i=1;i<=n;i++)
   {
     scanf("%d",&w[i]);
	 ch=getchar();
     t=0;
     while(ch!='\n'&&ch!=EOF)
     {
      t++;
      if(scanf("%d",&l[i][t])==EOF) break;
      ch=getchar();
     }
     s[i]=t;
    l[0][i]=i;
   }
   s[0]=n;  
}

void dfs(int kk)
{
	int i;
	if (f[kk]!=-1) return;
    if (s[kk]==0) 
	{
	f[kk]=w[kk];
	return;
	}
    for ( i=1;i<=s[kk];i++) 
    {
    	if (f[l[kk][i]]==-1) dfs(l[kk][i]);
    	f[kk]=max(f[l[kk][i]],f[kk]);
    }
	f[kk]+=w[kk];
}
int main()
{   
	init();
	dfs(0);
	printf("%d\n",f[0]);
		return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值