poj3249 Test for job 【图的DAG dp】

来源:互联网 发布:快披软件 编辑:程序博客网 时间:2024/04/27 20:34
#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>using namespace std;const int MAX=111111;int N,E;int v[MAX];const int MINF=-210000000;int in[MAX],out[MAX];int dp[MAX];vector<int>g[MAX];void tuopu(){stack<int>s;for(int i=1;i<=N;i++){if(in[i]==0)s.push(i);}int tmp=N;while(tmp--){int now=s.top();s.pop();for(int i=0;i<g[now].size();i++){dp[g[now][i]]=max(dp[g[now][i]],dp[now]+v[g[now][i]]);in[g[now][i]]--;if(!in[g[now][i]])s.push(g[now][i]);}}}int main(){#ifndef ONLINE_JUDGEfreopen("G:/1.txt","r",stdin);freopen("G:/2.txt","w",stdout);#endifwhile(scanf("%d%d",&N,&E)!=EOF)    {        for(int i=1;i<=N;i++)        {            scanf("%d",&v[i]);        }        for(int i=1;i<=E;i++)        {            int x,y;            scanf("%d%d",&x,&y);            out[x]++;            in[y]++;            g[x].push_back(y);        }        for(int i=1;i<=N;i++)        {            if(in[i]==0)                dp[i]=v[i];            else                dp[i]=MINF;        }        tuopu();        int maxn=MINF;        for(int i=1;i<=N;i++)        {            if(out[i]==0)                maxn=max(maxn,dp[i]);        }        printf("%d\n",maxn);        for(int i=1;i<=N;i++)        {            g[i].clear();        }        memset(v,0,sizeof(int)*N);        memset(in,0,sizeof(int)*N);        memset(out,0,sizeof(int)*N);        memset(dp,0,sizeof(int)*N);    }return 0;}

0 0
原创粉丝点击