给出一张有向图,每个点有点权,现要从一条入度为0的点到一个出度为0的点,问最大点权和
用拓扑排序的顺序+一个dp数组更新最大路径值
#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
struct node
{
int u,next;
}e[1111111];
int top,head[1111111],deg[1111111],a[1111111],dp[1111111],out[1111111];
void add(int u,int v)
{
e[top].u=v;
e[top].next=head[u];
head[u]=top++;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(head,-1,sizeof(head));
memset(deg,0,sizeof(deg));
memset(out,0,sizeof(out));
top=0;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
deg[b]++;
out[a]++;
}
queue<int>q;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
if(!deg[i])
{
dp[i]=a[i];
}
else dp[i]=-0x3f3f3f3f;
}
for(int i=1;i<=n;i++)
{
if(!deg[i])
{
q.push(i);
}
}
while(!q.empty())
{
int f=q.front();
q.pop();
for(int i=head[f];i!=-1;i=e[i].next)
{
int u=e[i].u;
dp[u]=max(dp[f]+a[u],dp[u]);
// max1=max(max1,dp[u]);
//printf("%d %d %d ....\n",f,u,dp[u]);
deg[u]--;
if(!deg[u])
{
q.push(u);
}
}
}
int max1=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(!out[i])
max1=max(dp[i],max1);
}
printf("%d\n",max1);
}
}