Codeforces#374(div2)- C. Journey(二分答案+dp)
来源:互联网 发布:淘宝网安卓版电脑下载 编辑:程序博客网 时间:2024/05/19 14:53
题目链接
http://codeforces.com/contest/721/problem/C
思路
二分最多能够经过多少个点,然后dp判断
状态表示:
转移方程:
边界条件:
当i == 1时,只要
细节
- 二分的时候L = 1,如果L = 2的话不会进入dp,因此不会记录路径
- 记录路径的时候也需要开2维
- 建图的时候边要反向,因为找的是前驱
代码
#include <iostream>#include <cstring>#include <stack>#include <vector>#include <set>#include <map>#include <cmath>#include <queue>#include <sstream>#include <iomanip>#include <fstream>#include <cstdio>#include <cstdlib>#include <climits>#include <deque>#include <bitset>#include <algorithm>using namespace std;#define PI acos(-1.0)#define LL long long#define PII pair<int, int>#define PLL pair<LL, LL>#define mp make_pair#define IN freopen("in.txt", "r", stdin)#define OUT freopen("out.txt", "wb", stdout)#define scan(x) scanf("%d", &x)#define scan2(x, y) scanf("%d%d", &x, &y)#define scan3(x, y, z) scanf("%d%d%d", &x, &y, &z)#define sqr(x) (x) * (x)const int maxn = 5000 + 5;const int INF = 0x3e3e3e3e;struct Edge { int from, to, dist; Edge(int u, int v, int w) : from(u), to(v), dist(w) { }};vector<Edge> edges;vector<int> G[maxn];int n, m, T;void addedge(int u, int v, int w) { edges.push_back(Edge(u, v, w)); G[u].push_back(edges.size() - 1);}int d[maxn][maxn], pa[maxn][maxn];int dp(int i, int j) { if (d[i][j] != -1) return d[i][j]; if (i == 1) return d[i][j] = j <= 1 ? 0 : INF; d[i][j] = INF; for (int ii = 0; ii < G[i].size(); ii++) { Edge e = edges[G[i][ii]]; int k = e.to; int t = dp(k, j - 1) + e.dist; if (t < d[i][j]) { d[i][j] = t; pa[i][j] = k; } } return d[i][j];}bool judge(int x) { memset(d, -1, sizeof(d)); int t = dp(n, x); return t <= T;}void print(int u, int x) { if (u == 1) return; print(pa[u][x], x - 1); printf(" %d", u);}int main() { scan3(n, m, T); for (int i = 0; i < m; i++) { int x, y, z; scan3(x, y, z); addedge(y, x, z); } int L = 1, R = n, M = (L + R) >> 1; while (L < R) { if (R == L + 1) { if (judge(R)) M = R; else { judge(L); M = L; } break; } else { M = (L + R) >> 1; if (judge(M)) L = M; else R = M; } } printf("%d\n", M); printf("1"); print(n, M); return 0;}
0 0
- Codeforces#374(div2)- C. Journey(二分答案+dp)
- CodeForces 721C Journey(DP)
- codeforces 721C. Journey(dp+拓扑)
- Codeforces Round #374 (Div. 2) -- C. Journey (DP)
- Codeforces #374 div2 C Dp
- CF #262 (DIV2) C . Present (二分答案)
- Codeforces 721C. Journey(DAG上的DP)
- Codeforces 721C Journey (简单dp,dfs)
- Codeforces-721C:Journey(最短路上的DP)
- Codeforces 839C Journey (树形dp + 概率期望)
- codeforces#428(div2)C Journey(树上的dfs水题)
- codeforces 428div2 C journey dfs+期望
- codeforces #262 DIV2 C题Present(二分+贪心)
- codeforce 374C. Journey(dp)
- Codeforces #374(Div.2)C. Journey【DAG图上的拓扑排序+Dp】
- codeforces round367 div2.C (DP)
- Codeforces Round #374 (Div. 2) C. Journey dp
- CodeForces Round#374 C:Journey(dfs图论+dp)
- php解析json
- STM2串口配置
- 使用phpMyAdmin中出现的错误
- Haskell第一课
- 《流数据技术及其应用现状》读后感
- Codeforces#374(div2)- C. Journey(二分答案+dp)
- Spring @autowire用法
- c++代码重用
- apt-get remove, apt-get autoremove和aptitude remove的区别
- POJ 1001 总结
- ubuntu上网和安装远程操控
- Ubuntu下的一些快捷键和命令
- Java泛型(浅显认识)
- HDU5808Price List Strike Back (BestCoder Round #86 E) cdq分治+背包