题目链接: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;
}