CodeForces 721 C. Journey [DP in DAG]
2018-02-10 15:36
417 查看
http://codeforces.com/contest/721/problem/C
这道题给出了一个DAG,求一条从给定的起点到终点在边权和范围内经过点数最多的路。
很少做过在DAG上跑dp的题,那么首先我们定义状态dpi,jdpi,j 为到达第i个点时经过了j个节点的最短距离。那么更新的时候跑一边dfs之后按照点数最大的原则找到并输出路径即可。
这道题给出了一个DAG,求一条从给定的起点到终点在边权和范围内经过点数最多的路。
很少做过在DAG上跑dp的题,那么首先我们定义状态dpi,jdpi,j 为到达第i个点时经过了j个节点的最短距离。那么更新的时候跑一边dfs之后按照点数最大的原则找到并输出路径即可。
#include <bits/stdc++.h> #include <cstring> #define ll long long #define sqr(x) x*x using namespace std; const int maxn = 5e3+5; const int INF= 0x3f3f3f3f; int d[maxn],len[maxn]; bool vis[maxn]; pair<int,int> dp[maxn][maxn]; vector<pair<int,int> > edge[maxn]; int n,m,t; void dfs(int u) { vis[u] = 1; if(u == 1) dp[u][1] = make_pair(0,0); for(auto p : edge[u]) { int v = p.first; int w = p.second; if(!vis[v]) dfs(v); for(int i = 1;i<=n;i++) { dp[u][i] = min(dp[u][i],make_pair(dp[v][i- 1].first+w,v)); } } } int main() { cin>>n>>m>>t; for(int i =0 ;i<m;i++) { int u,v,w; cin>>u>>v>>w; edge[v].push_back(make_pair(u,w)); } for(int i = 1;i<=n;i++) { for(int j = 0; j<=n;j++) { dp[i][j] = make_pair(INF,-1); } } dfs(n); for(int i = n;i>=1;i--) { if(dp [i].first <= t) { stack<int> st; cout<<i<<endl; for(int j = n,k = i;k>=1;j = dp[j][k].second,k--) { st.push(j); } while(!st.empty()) { cout<<st.top()<<" "; st.pop(); } cout<<endl; break; } } return 0; }
相关文章推荐
- codeforces 721 Journey (拓扑序+DP)
- [DP 平衡树] Codeforces 809D Round #415 (Div. 1) D. Hitchhiking in the Baltic States
- Codeforces 835 F Roads in the Kingdom(树形dp)
- Codeforces 161 D Distance in Tree 树形DP
- Codeforces 161 D. Distance in Tree (树dp)
- codeforces 161D D. Distance in Tree(树形dp)
- codeforces 480C C. Riding in a Lift(dp)
- Codeforces-721C:Journey(最短路上的DP)
- Codeforces 721C. Journey(DAG上的DP)
- 【Codeforces】Codeforces Round #374 (Div. 2) -- C. Journey (DP)
- codeforces 161D - Distance in Tree(树形dp)
- [Codeforces 814D] An overnight dance in discotheque 树形dp,贪心
- 【Codeforces Round 374 (Div 2)C】【DAG上的DP】Journey 有向无环图从1到n时刻T内的最多经过点数
- 【codeforces 721C】【DAG 按照拓扑排序记忆化DFS】C. Journey 【DAG图,5000个点,5000条边 让你求从1到n的路径长度不超过T中经过点数最多的一条 】
- CodeForces 160D - Distance in Tree 树形DP
- CodeForces 761C 【DP】
- codeforces 459E E. Pashmak and Graph(dp)
- Android 中的长度单位详解 dp、sp、px、in、pt、mm 转载
- Codeforces 696B Puzzles(期望+树形dp)
- Android中的属性长度单位详解[dp、sp、px、in、pt、mm]