zoukankan      html  css  js  c++  java
  • 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#
    ",cas++);
            printf("points : %lld
    ",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("
    ");
            if(t) puts("");
        }
        return 0;
    }
  • 相关阅读:
    SDOI2019游记
    noi.ac309 Mas的童年
    51nod1237 最大公约数之和
    loj6074 子序列
    noi.ac89A 电梯
    51nod97B 异或约束和
    bzoj4490 随机数生成器Ⅱ加强版
    CF55D Beautiful numbers
    CF24D Broken robot
    CF226D The table
  • 原文地址:https://www.cnblogs.com/LukeStepByStep/p/5935141.html
Copyright © 2011-2022 走看看