Codeforces712 C. Journey (DP / 记忆化搜索)
来源:互联网 发布:php图片管理系统 编辑:程序博客网 时间:2024/06/08 00:09
题目连接:http://codeforces.com/contest/721/problem/C
题目大意:给出一个有向无环图,每条边都有时间,求在给定时间内从1走到n最多经过多少个点,输出路径。
解题思路:DP。
dp[i][j]表示走到第i个点时经过了j个点的花费。
因为要输出路径,用pre记录,并且反向建图(递归输出路径,所以要反向)。
注意必须用vis记录经过的点,不然会TLE test11,因为即使无环,但一个点也可能经过多次,如:
1 2 1
1 3 1
1 4 1
2 5 1
3 5 1
4 5 1
如这组数据5就经过了3次。
其他细节看代码吧……
/* ***********************************************┆ ┏┓ ┏┓ ┆┆┏┛┻━━━┛┻┓ ┆┆┃ ┃ ┆┆┃ ━ ┃ ┆┆┃ ┳┛ ┗┳ ┃ ┆┆┃ ┃ ┆┆┃ ┻ ┃ ┆┆┗━┓ 马 ┏━┛ ┆┆ ┃ 勒 ┃ ┆ ┆ ┃ 戈 ┗━━━┓ ┆┆ ┃ 壁 ┣┓┆┆ ┃ 的草泥马 ┏┛┆┆ ┗┓┓┏━┳┓┏┛ ┆┆ ┃┫┫ ┃┫┫ ┆┆ ┗┻┛ ┗┻┛ ┆************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <bitset>using namespace std;#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)#define pb push_back#define mp make_pairconst int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define LL long long#define ULL unsigned long long#define MS0(X) memset((X), 0, sizeof((X)))#define SelfType intSelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);}SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;}#define Sd(X) int (X); scanf("%d", &X)#define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())#define all(a) a.begin(), a.end()#define mem(x,v) memset(x,v,sizeof(x))typedef pair<int, int> pii;typedef pair<long long, long long> pll;typedef vector<int> vi;typedef vector<long long> vll;inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}//#pragma comment(linker, "/STACK:102400000,102400000")const int N = 5005;int n,m,t;struct Edge{ int to,nx,w;}edge[N*2];int cnt,head[N];void addedge(int u,int v,int w){ edge[cnt] = Edge{v,head[u],w}; head[u] = cnt++;}bool vis[N];int dp[N][N],pre[N][N];void solve(int u){ if(vis[u])return; vis[u] = 1; for(int i=head[u];~i;i=edge[i].nx) { int v = edge[i].to; int w = edge[i].w; solve(v); for(int j=1;j<=n;j++) { if(dp[v][j-1]+w<dp[u][j]) { dp[u][j] = dp[v][j-1] + w; pre[u][j] = v; } } }}void path(int x,int y){ if(y>1) path(pre[x][y],y-1); printf("%d ",x);}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);ios::sync_with_stdio(0);cin.tie(0);n = read(), m = read(), t = read();memset(dp,inf_add,sizeof dp);dp[1][1] = 0;memset(head,-1,sizeof head);for(int i=1;i<=m;i++) { int u,v,w; u = read(), v = read(), w = read(); addedge(v,u,w); } solve(n); int mx; for(int i=n;i;i--) { if(dp[n][i]<=t) { mx = i; break; } } printf("%d\n",mx); path(n,mx);return 0;}
0 0
- Codeforces712 C. Journey (DP / 记忆化搜索)
- codeforces 721C 记忆化搜索 / dp
- 记忆化搜索(搜索+dp思想)
- dp记忆化搜索
- 记忆化搜索,dp
- 记忆化搜索DP
- poj 1088 (dp记忆化搜索)
- poj 1579(记忆化搜索)DP
- 滑雪(poj1088,DP+记忆化搜索)
- Lightoj 1036 DP(记忆化搜索)
- Lightoj 1084 记忆化搜索(DP)
- hdu1978(记忆化搜索/DP)
- loj 1044(dp+记忆化搜索)
- hdu3555(数位dp记忆化搜索)
- codeforces (数位dp 记忆化搜索)
- 记忆化搜索dp(uva10739)
- NUBT1475 数位dp(记忆化搜索)
- POJ 3616(dp/记忆化搜索)
- 大学生活杂记
- 杨辉三角
- Linux CGROUP 数据结构
- 微信网页开发样式
- [BZOJ]1009 [HNOI2008]GT考试(ac自动机+矩阵快速幂优化状态转移)
- Codeforces712 C. Journey (DP / 记忆化搜索)
- linux用户和组管理类命令
- Photoshop制作Gif动画
- 计算机网络常见面试题
- C++内存管理详解
- SQLite文件格式初步分析之varint
- 牛客网刷题之从尾到头打印链表
- U盘安装 Ubuntu 16.04 单系统
- Android中的 事件流----浅析安卓中的动与静(三) 线程间通讯