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条能量流动 ...
随机推荐
- Mybatis的CRUD 增删改查
目录 namespace 命名空间 select insert update delete Mybatis 官网: https://mybatis.org/mybatis-3/zh/getting-s ...
- 【Linux】配置ssh留下的一些思考和大坑解决办法
今天传包突然有问题,结果发现是ssh出现了问题,密钥也在里面,都是正常的,但是还有什么问题呢? 后来总结下需要注意点: 1.最开始你要检查.ssh/ 这个文件夹的权限,看下权限是否为700或者为75 ...
- 【Linux】使用cryptsetup加密磁盘 策略为LUKS
LUKS(Linux Unified Key Setup)为Linux硬盘分区加密提供了一种标准,它不仅能通用于不同的Linux发行版本,还支持多用户/口令.因为它的加密密钥独立于口令,所以如果口令失 ...
- 【Linux】服务器识别ntfs移动磁盘方法
Linux服务器无法识别ntfs磁盘 如果想识别的话,需要安装一个包ntfs-3g 安装好后,将移动磁盘插入到服务器的usb口中 新建一个目录,将磁盘挂载在新建的目录上 挂载命令如下: mount - ...
- LeetCode783. 二叉搜索树节点最小距离
题目 和LeetCode530没什么区别 1 class Solution { 2 public: 3 vector<int>ans; 4 int minDiffInBST(TreeNod ...
- 1V升压5V和1.5V升压5V的集成电路芯片
1.5V和1V输入,要升压输出5V的集成电路芯片合适? 干电池标准电压是1.5V,放电电压后面在0.9V-1V左右,如果要选用干电池1.5V升压到5V的合适的芯片,需要满足低压1V或者0.9V更好的低 ...
- jackson学习之三:常用API操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- H3C、Huawei、Cisco网络设备AAA TACACS认证配置
TACACS技术白皮书 摘要:TACACS是实现AAA功能的一种安全协议,主要是通过TACACS客户端与TACACS服务器通信来实现多种用户的AAA功能. HWTACACS采用TCP协议承载报文,TC ...
- Lua大量字符串拼接方式效率对比及原因分析
Lua大量字符串拼接方式效率对比及原因分析_AaronChan的博客-CSDN博客_lua字符串拼接消耗 https://blog.csdn.net/qq_26958473/article/detai ...
- circus reload
circus reload Configuration - Circus 0.15.0 documentation https://circus.readthedocs.io/en/latest/fo ...