CodeForces - 721C 拓扑排序+dp
题意:
n个点m条边的图,起点为1,终点为n,每一条单向边输入格式为:
a,b,c //从a点到b点耗时为c
题目问你最多从起点1到终点n能经过多少个不同的点,且总耗时小于等于t
题解:
这道题我原本以为是改一下最短路去做,,,但是想不到怎么写。网上搜了搜,发现是拓扑+dp。
拓扑排序有啥用?
比如一共有好多件事情,事情A要再事情B(或者更多)事情做完才能做,也就是给你了一种完成事件的顺序
那么转化到这道题上就是从1点到其他点有多种方式,它就是按顺序做这些事情(也就是按这个顺序dp)
那么我看了网上代码后发现,他们都是把1这个点当于没有入度去处理,也就是数据默认1这个点的入度为0
譬如下面这个数据用在本题代码上就不行:
4 5 2
1 2
3 2
3 4
1 3
4 1
但是实际画图你会发现1->3->4这条路是可以的
回归本题dp:
dp[i][j],到达i点时,观光了j个景点的最小时间
转移是这样对于一条边u -> v,dp[v][j] = min(dp[v][j],dp[u][j - 1] + dis[u][v]);
代码:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <math.h>
5 #include <string.h>
6 #include <queue>
7 #include <set>
8 #include <map>
9 #include <algorithm>
10 using namespace std;
11 const int maxn=5005;
12 const int inf=0x3f3f3f3f;
13 int vin[maxn];
14 struct edge
15 {
16 int v;
17 int cost;
18 edge(int a,int b)
19 {
20 v=a,cost=b;
21 }
22 };
23 typedef vector<edge> vec;
24 vec e[maxn];
25 int n,m,t;
26 struct node
27 {
28 int per;
29 int use;
30 } dp[maxn][maxn];
31 void tp()
32 {
33 queue<int>q;
34 for(int i=1; i<=n; i++)
35 if(vin[i]==0)
36 q.push(i);
37 while(!q.empty())
38 {
39 int u=q.front();
40 q.pop();
41 for(int i=0; i<e[u].size(); i++)
42 {
43 int v=e[u][i].v;
44 int cost=e[u][i].cost;
45 vin[v]--;
46 if(vin[v]==0)
47 q.push(v);
48 for(int j=1; j<=n; j++)
49 if(dp[v][j].use>dp[u][j-1].use+cost)
50 {
51 dp[v][j].use=dp[u][j-1].use+cost;
52 dp[v][j].per=u;
53 }
54 }
55 }
56 }
57 void show(int i,int j)
58 {
59 if(dp[i][j].per==-1)
60 {
61 printf("1 ");
62 return;
63 }
64 show(dp[i][j].per,j-1);
65 printf("%d ",i);
66 }
67 int main()
68 {
69 cin>>n>>m>>t;
70 int a,b,c;
71 for(int i=0; i<=n; i++)
72 for(int j=0; j<=n; j++)
73 {
74 dp[i][j].use=inf;
75 }
76 memset(vin,0,sizeof(vin));
77 for(int i=0; i<m; i++)
78 {
79 scanf("%d%d%d",&a,&b,&c);
80 e[a].push_back(edge(b,c));
81 vin[b]++;
82 }
83 dp[1][1].use=0;
84 dp[1][1].per=-1;
85 tp();
86 for(int i=n; i>=1; i--)
87 {
88 if(dp[n][i].use<=t)
89 {
90 printf("%d\n",i);
91 show(n,i);
92 return 0;
93 }
94 }
95 return 0;
96 }
CodeForces - 721C 拓扑排序+dp的更多相关文章
- POJ 3249 拓扑排序+DP
貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...
- [NOIP2017]逛公园 最短路+拓扑排序+dp
题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...
- 洛谷P3244 落忆枫音 [HNOI2015] 拓扑排序+dp
正解:拓扑排序+dp 解题报告: 传送门 我好暴躁昂,,,怎么感觉HNOI每年总有那么几道题题面巨长啊,,,语文不好真是太心痛辣QAQ 所以还是要简述一下题意,,,就是说,本来是有一个DAG,然后后来 ...
- 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP
1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 456 Solved: 215[Submit][Stat ...
- 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP
[BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp
题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...
- 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...
- 【bzoj4562】[Haoi2016]食物链 拓扑排序+dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6832118.html 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动 ...
随机推荐
- C语言字符串结束符“\0”
介绍 '\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写.'\0'就是 字符串结束标志. '\0'是转译字符,意思是告诉编译器,这不是字符0,而是空字符.空字符\0对应 ...
- 算法模板 - C++ 高精度运算
C++算法板子 高精度 高精度推荐用python来写,python有大整数,这里写的是关于C++的高精度运算模板 1.高精 * 低精 #include <iostream> #includ ...
- 【中文】【deplearning.ai】【吴恩达课后作业目录】
[目录][吴恩达课后作业目录] 吴恩达深度学习相关资源下载地址(蓝奏云) 课程 周数 名称 类型 语言 地址 课程1 - 神经网络和深度学习 第1周 深度学习简介 测验 中英 传送门 无编程作业 编程 ...
- JS获取本机地址,生成地图
dome代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- ryu安装
$ python3 -V Python 3.7.2 $ git clone https://github.com/faucetsdn/ryu.git $ cd ryu $ sudo pip3 inst ...
- Java编程技术之浅析SPI服务发现机制
SPI服务发现机制 SPI是Java JDK内部提供的一种服务发现机制. SPI->Service Provider Interface,服务提供接口,是Java JDK内置的一种服务发现机制 ...
- Maven 依赖机制
概述 在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级.让我们看一个案例研究,以了解它是如何工作的.假设你想使用 Log4j 作为项目的日志.这里你要做什么? 传统方式 访问 ...
- vercel是什么神仙网站?
Vercel? vercel是我用过的最好用的网站托管服务.本网站就是基于hexo引擎模板开发,托管在vercel上的. vercel类似于github page,但远比github page强大,速 ...
- XA Transactions
XA Transactions XA is a two-phase commit protocol that is natively supported by many databases and t ...
- Supporting Multiple Versions of WebSocket Protocol 支持多版本WebSocket协议
https://tools.ietf.org/html/rfc6455#section-4.4 4.4. Supporting Multiple Versions of WebSocket Proto ...