您的位置:首页 > 其它

图上DP POJ3249

2015-08-29 20:12 267 查看
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int val[100100];
int head[100100];
int dp[100100];
int num;
bool in[100010];
bool en[100010];

struct edge
{
int fro,to,next;
}e[10000100];

void addEdge(int _fro,int _to)
{
num++;
e[num].fro=_fro;
e[num].to=_to;
e[num].next=head[_fro];
head[_fro]=num;
}

int dfs(int x)
{
if(dp[x]!=0)
return dp[x];
dp[x]=-(1<<29);
for(int i=head[x];i!=-1;i=e[i].next)
{
int v=e[i].to;
dfs(v);
dp[x]=max(dp[x],dp[v]+val[x]);
}
return dp[x];
}

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
num=0;
memset(head,-1,sizeof(head));
for(int i=0;i<=n;i++)
{
in[i]=true;
en[i]=true;
}
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
en[b]=false;
in[a]=false;
addEdge(b,a);
}
int ans=-(1<<29);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
if(en[i])
dp[i]=val[i];
}
for(int i=1;i<=n;i++)
{
if(in[i])
{
ans=max(ans,dfs(i));
}
}
cout<<ans<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: