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 ...
随机推荐
- Hadoop 2.4.0完全分布式平台搭建、配置、安装
一:系统安装与配置 Hadoop选择下载2.4.0 http://hadoop.apache.org / http://mirror.bit.edu.cn/apache/hadoop/common/h ...
- Firefly框架参考
在游戏服务器端,往往需要处理大量的各种各样的任务,每一项任务所需的系统资源也可能不同.而这些复杂的任务只用一个单独的服务器进程是很难支撑和管理起来的.所以,游戏服务器端的开发者往往需要花费大量的时间精 ...
- 解决Ubuntu root账户的问题
问题的提出:在Linux环境下,许多操作需要有管理员权限才能进行.如果没有root权限,就连基本的文件拷贝操作都只能在用户文件夹下进行,而对于Ubuntu系统,安装时是没有设定root帐号的,那么怎样 ...
- 第六章Audio设备
6.1 Audio设备介绍 USB协议制定时,为了方便不同设备的开发商基于USB进行设计,定义了不同的设备类来支持不同类型的设备.虽然在USB标准中定义了USB_DEVICE_CLASS_AUDIO- ...
- 卸载Visual Studio Code后删除右键Open with Code…
Win+R,输入 regedit ,点击确认,进入注册表编辑器 Ctrl+F,搜索 Ticino ,将搜索出来的Ticino都删除就行了
- poj2187
求最远点对,这是一道经典的旋转卡壳的题目话说由于是前年写的,之后就没怎么研究过计算几何了……感觉都不大记得清了,来稍微回忆一下……首先最远点对一定出现在凸包上显然,然后穷举肯定不行,这时候就需要旋转卡 ...
- JavaScript里的类和继承
JavaScript与大部分客户端语言有几点明显的不同: JS是 动态解释性语言,没有编译过程,它在程序运行过程中被逐行解释执行JS是 弱类型语言,它的变量没有严格类型限制JS是面向对象语言,但 没有 ...
- 多线程模式之MasterWorker模式
多线程模式之MasterWorker模式 Master-Worker模式的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负 ...
- lua部分 tips
lua文件刷新 function require_ex( _mname ) if _mname == "" then return end if package.loaded[_m ...
- FIRST集和FOLLOW集
省略号代表其他相关产生式得出的终结符号,一开始的时候,省略号里面是没有的 求FIRST集 情况壹 如果A只在→的右边出现,那么FIRST(A)={A},例子M→α,FIRST(α)={α} 情况 ...