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;
}
时间: 2024-08-17 13:11:40

DAG最长路问题 hdu-1224的相关文章

简单Dp----最长公共子序列,DAG最长路,简单区间DP等

/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100]; int mu[100]; int Dp[100][100]; int main() { int n,x; scanf("%d", &n

UVA 11324 The Largest Clique (强连通缩点 + DAG最长路)

链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=30726 题意 : 有向图G,求一个最大的点集,使得点集中任意两个节点u和v,满足 要么u可以到达v,要么v可以到达u,或者u和v可以相互到达. 可以强连通缩点成一张DAG,以为每个强连通分量要么选要么不选.求DAG上的最长路 二次建图 用了2种不同的方法,也分别用了记忆花搜索DP和直接递推DP vector建图和记忆化搜索: #include <algorithm

02_嵌套矩形(DAG最长路问题)

来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件为:当且仅当a<c,b<d 或者b<c,a<d(相当于把矩形X旋转90 度).选出尽量多的矩形排成一行,使得除了最后一个之外,每一个矩形都可以嵌套在下一个矩形内. 分析:对于本题中的n个矩形,以每个矩形作为一个点,若X矩形能嵌套在Y矩形中,则从X向Y连一条边,题目则变为了在DAG(无回

挖地雷问题(DAG最长路)

挖地雷问题 (P3.pas/c/cpp) 来源:NOIP1996(提高组)第三题(有改动) [问题描述] 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径. 当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束.设计一个挖地雷的方案,使某人能挖到最多的地雷. [输入文件] N:(表示地窖的个数)   W1,W2,W3,--WN (表示每个地窖中埋藏的地雷数量) A12-

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

Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8990   Accepted: 2004 Description Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job

uva 10131 Is Bigger Smarter? dag 最长路 加路径还原

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> #define INF 10000

hdu 1224 Free DIY Tour(最长路/dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1224 基础的求最长路以及记录路径.感觉dijstra不及spfa好用,wa了两次. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h> #

hdu 1224 Free DIY Tour(最长的公路/dp)

http://acm.hdu.edu.cn/showproblem.php? pid=1224 基础的求最长路以及记录路径. 感觉dijstra不及spfa好用,wa了两次. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h>

Hdu 3696 Farm Game(最长路)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3696 思路:每种商品可以直接卖掉,也可以换购后卖掉.所以设点n+1,从该点向每个商品连边权值为log(p[i])(将乘法转换为加法,直接使用SPFA)表示直接卖掉的单位价值:对于可以换购的商品 i-->j,连 j--> i 权值为log(b[j])的边(反向建图,只需求一次最长路),表示单位 i 商品可以转换为b[j] 的 j 商品(求最长路时逐步累乘转换率).求n+1点到各点的最长路,dist[