首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。