codeforces 721C (拓扑+dp)
题意就是某个人去游览,起点是1点,终点是n点,他总的游览时间不能超过t,第一行给你3个数字,点的个数n,边的个数m,时间t,然后底下m行数据,每行代表一条边,边的起点,终点和权值(走过去花的时间),然后问你,她想尽量多的游览景点,还要求总时间不能超过t(他在景点不会逗留,所以只要计算路程花费的时间即可),问你怎么走,输出路径
题目我不会做,看了题解,dalao的思路的拓扑+dp,直接dp貌似不行,为什么用拓扑+dp呢- -,我感觉里面就是让你求最长的哈密顿路径- -,这就很哲学了- -,看了dalao的代码,给dalao的代码加点注释,方便以后自己查看
#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>
#include <string.h>
#include <map>
using namespace std;
const int Maxn = 5e3+;
const int INF = 0x3f3f3f3f; struct Node{//构造函数
int to;
int dis;
Node(){}
Node(int a,int b){
to = a;
dis = b;
}
}; int dp[Maxn][Maxn];
std::vector<Node> G[Maxn];
std::queue<int> q;
std::map<int,int> du;
int ans[Maxn];
int pre[Maxn][Maxn]; int main(){
int n,m,t;
scanf("%d%d%d",&n,&m,&t);
memset( dp,INF,sizeof( dp ) );//初始化为无穷大
int Begin,End,w;
for( int i = ; i <= m; i++ ){
scanf("%d%d%d",&Begin,&End,&w);
G[Begin].push_back( Node( End,w ) );//将与之begin相邻的点放在vector里
du[End]++;//End点的入度+1 为下面拓扑排序做准备
}
dp[][] = ;
for( int i = ; i <= n; i++ ){//将入度为0的点压入队列中(kahn算法拓扑排序)
if( !du[i] ){
q.push(i);
}
}
while( !q.empty() ){
int i = q.front();
q.pop();
for( auto x : G[i] ){//取出所有的与i点为起点的点(即处理i线段)
Node tmp = x;
if( !--du[tmp.to] ){//将i点的那条线段的终点入度减一,如果为0,压入队列(kahn算法)
q.push(tmp.to);
}
for( int k = ; k <= n; k++ ){//起点必须为1点,所以从2开始
if( dp[i][k-] + tmp.dis < dp[tmp.to][k] ){//dp[i][j]代表从1到i点,经历了j条边的权值总和
dp[tmp.to][k] = dp[i][k-] + tmp.dis;//如果1到i经历了k-1条边+从i到i.to那条边的和小于从1到i经历了k条边
pre[tmp.to][k] = i;//就更新一下值(尽量选大的)
//记录下父亲节点
}
}
}
}
int num;
for( int i = n; i >= ; i-- ){
if( dp[n][i] <= t ){//找到第一个满足条件的点
num = i;
break;
}
}
ans[num] = n;//终点为n
for( int i = n,j = num; j > ; i = pre[i][j],j-- ){
ans[j-] = pre[i][j];//记录下路径
}
printf("%d\n",num);
for( int i = ; i <= num; i++ ){
printf("%d ",ans[i]);
}
return ;
}
codeforces 721C (拓扑+dp)的更多相关文章
- CodeForces - 721C 拓扑排序+dp
题意: n个点m条边的图,起点为1,终点为n,每一条单向边输入格式为: a,b,c //从a点到b点耗时为c 题目问你最多从起点1到终点n能经过多少个不同的点,且总耗时小于等于t 题解: 这道 ...
- Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp
A. One-dimensional Japanese Crossword time limit per test 1 second memory limit per test 256 megabyt ...
- 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)
LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...
- luogu2149 Elaxia的路线 (dijkstra+拓扑dp)
先标记上一个人所有最短路上的边(同时也要标记反向边) 然后拿着另一个人最短路上的边(会构成一个DAG)去做拓扑dp,记从原点到某个点的最大的某个路径的被标记的边的个数 #include<bits ...
- UVA 11324.The Largest Clique tarjan缩点+拓扑dp
题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...
- CodeForces 721C Journey(拓扑排序+DP)
<题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
- codeforces 721C (拓排 + DP)
题目链接:http://codeforces.com/contest/721/problem/C 题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出. 思路:比赛的时候只想到拓排然后就不知 ...
- codeforces 721C C. Journey(dp)
题目链接: C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...
随机推荐
- 在MAC中安装Compass的方法 (转)
在MAC中通过gem命令安装compass时会出异常,原因是compass版本更新了,一些运行时所用到的依赖软件的版本没能得到更新,故而出现错误.例如,用以下命令安装compass: $ gem in ...
- Java免费开源数据库、Java嵌入式数据库、Java内存数据库
Java免费开源数据库.Java嵌入式数据库.Java内存数据库 http://blog.csdn.net/leiyinsu/article/details/8597680
- INF文件
百度百科:http://baike.baidu.com/view/637107.htm?fr=ala0_1_1 INF简介 INF是Device INFormation File的英文缩写,是Micr ...
- Qt for PC,Qt for iOS,Qt for Android (居士的博客)
http://blog.csdn.net/Esonpo/article/details/38081607 http://blog.csdn.net/Esonpo/article/details/380 ...
- 忘记commit的一次教训
由于业务需求,已经上线的系统新增加了一些需求,其中一个需求是,从一个SQLSERVER数据库导入数据到生产的ORCLE数据库, 由于我的失误导致系统上线后 生产的Oracle数据没有导入成功,但是在本 ...
- 【HDOJ】1253 胜利大逃亡
经典的BFS,需要注意的是当前时间超过最小时间,输出-1.同时,队列为空时还未返回,证明并未找到终点(可能终点为墙).此时也应该输出-1,这个部分容易wa. #include <cstdio&g ...
- BOM List demo
select level level_id, t.* from (select msi1.segment1 farther_item, msi1.inv ...
- Azure Site Recovery:我们对于保障您的数据安全的承诺
Anoob Backer 云 + Enterprise 项目经理 Azure Site Recovery是一个基于 Azure的全天候.易用的服务,可以安全地安排恢复操作,一旦发生灾难,即可为您 ...
- Matlab工具箱安装体会
总结有两点: 1.如需添加jar包等附加库,可在待安装工具箱下,新建一个java文件夹,并将jar包等文件存放在里面,然后执行以下操作: 1)Create or open your preferenc ...
- 理解SVG坐标系统和变换: 建立新视窗
在SVG绘制的任何一个时刻,你可以通过嵌套<svg>或者使用例如<symbol>的元素来建立新的viewport和用户坐标系.在这篇文章中,我们将看一下我们如何这样做,以及这样 ...