记录编号 222476 评测结果 AAAAAAAAAA
题目名称 [POJ 2342] 猴腮雷 最终得分 100
用户昵称 Gravatarsvideo 是否通过 通过
代码语言 C++ 运行时间 0.024 s
提交时间 2016-02-03 09:54:43 内存使用 0.46 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,w[6001],ne=0;//ne为总边数
bool in[6001];//用来寻找根节点
int f[6001][2];
int hd[6001];

struct data{
	int v;
    int next;
}e[6001];

void insert(int v,int u)//插入一条边
{
	ne++;
	e[ne].v=v;
	e[ne].next=hd[u];
	hd[u]=ne;
}

void dp(int u)
{
	f[u][1]=w[u];//1表示取,0表示不取 
	f[u][0]=0;
	for(int p=hd[u];p!=0;p=e[p].next)
	{
		int v=e[p].v;
		dp(v);
		f[u][1]+=f[v][0];
		f[u][0]+=max(f[v][1],f[v][0]);//转移方程 
	}
}

int main()
{
    freopen("monk.in","r",stdin);
    freopen("monk.out","w",stdout);
	cin>>n;
	int l,k;
	for(int i=1;i<=n;i++)
	   cin>>w[i];
    while(cin>>l>>k)
    {
    	if(l==0&&k==0) break;
    	in[l]=1;
    	insert(l,k);
    }
    for(int i=1;i<=n;i++)
       if(!in[i])
       {
       	   dp(i);
       	   cout<<max(f[i][0],f[i][1]);
       	   break;
       }
	return 0;
}