DAG最长路问题 hdu-1224

Posted Luke_Ye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAG最长路问题 hdu-1224相关的知识,希望对你有一定的参考价值。

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

#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#define LL long long int
using 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的主要内容,如果未能解决你的问题,请参考以下文章

poj 3249 Test for Job (DAG最长路 记忆化搜索解决)

旅行计划-DAG上最长路

POJ 1949 Chores(DAG上的最长路 , DP)

DAG的运用:拓扑排序(AOV),关键路径(AOE)与dp的关系

关于最长路

动态规划