poj 3249 DAG求最短路

来源:互联网 发布:信用社支票打印软件 编辑:程序博客网 时间:2024/05/23 22:14

给出一张有向图,每个点有点权,现要从一条入度为0的点到一个出度为0的点,问最大点权和

用拓扑排序的顺序+一个dp数组更新最大路径值

#include <stdio.h>#include <string.h>#include<algorithm>#include<queue>using namespace std;#define ll long longstruct 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);    }}

原创粉丝点击