首页 > 代码库 > DAG最长路问题 hdu-1224

DAG最长路问题 hdu-1224

 用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白。据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来。

#include <iostream>#include <cstdio>#include <vector>#include <stack>#define LL long long intusing namespace std;LL sta[105];vector<int> g[105];LL dp[1005];int pre[1005];void dfs(int now,int sa){    //puts("s");    sa+=sta[now];    for(int i=0;i<g[now].size();i++)    {        int p=g[now][i];        if(sa+sta[p]>dp[p])        {            dp[p]=sa+sta[p];            pre[p]=now;            dfs(p,sa);        }    }}void ini(int n){    for(int i=0;i<=n+1;i++)        g[i].clear(),pre[i]=i,dp[i]=0,sta[i]=0;}int main(){    int t,cas=1;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d",&n);        ini(n);        for(int i=1;i<=n;i++)            scanf("%lld",&sta[i]);        scanf("%d",&m);        for(int i=0;i<m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            g[a].push_back(b);        }        dfs(1,0);        printf("CASE %d#\n",cas++);        printf("points : %lld\n",dp[n+1]);        printf("circuit : ");        stack<int> ss;        int pos=n+1;        while(pre[pos]!=pos)            ss.push(pos),pos=pre[pos];        printf("1");        while(!ss.empty())            printf("->%d",ss.top()==n+1?1:ss.top()),ss.pop();        printf("\n");        if(t) puts("");    }    return 0;}

 

DAG最长路问题 hdu-1224