PAT1018 Public Bike Management【dfs】【最短路】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805489282433024
题意:
给定一个图,一个目的地和每个节点上的自行车数量。
现在要找到从0到目的地的一条最短路,并且对这条路径上的点的自行车数目进行调度使得每个节点的自行车数量都是某个定值。
可以从前面经过的节点搬运自行车到后面的节点,0号节点的自行车是无穷多的。
如果最短路不唯一,要求找到从0号带出的自行车数量最小的方案。
如果还是不唯一,要求找到带回0号的自行车数量最小的方案。
思路:
刚开始直接就想要同时最优化路径和调度车数量跑dijkstra了。但是这样是不对的。
应该要先完最短路,否则会出现前面的某个节点就出现了最短路相同而选择了另一条车少的但是影响了后面的最短路。
总之就是这样跑出来的最短路,并不是时间最短的。
所以我们应该要先跑最短路,然后再在几条最短路里面搜索他们各自调度自行车的数量。这里用dfs
每次搜索到了目的地就看看是不是比原答案更优。
1 //#include<bits/stdc++> 2 #include<stdio.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<stdlib.h> 7 #include<queue> 8 #include<map> 9 #include<stack> 10 #include<set> 11 12 #define LL long long 13 #define ull unsigned long long 14 #define inf 0x7f7f7f7f 15 16 using namespace std; 17 18 int cmax, n, spro, m, perf; 19 const int maxn = 505; 20 vector<pair<int, int> > g[maxn]; 21 int bike_num[maxn]; 22 23 bool vis[maxn]; 24 int d[maxn]; 25 int cnt[maxn]; 26 int prv[maxn]; 27 28 int findmin() 29 { 30 int mmm = inf, id = -1; 31 for(int i = 0; i <= n; i++){ 32 if(!vis[i] && d[i] < mmm){ 33 mmm = d[i]; 34 id = i; 35 } 36 } 37 return id; 38 } 39 void dijkstra() 40 { 41 memset(d, 0x3f, sizeof(d)); 42 for(int i = 0; i < g[0].size(); i++){ 43 d[g[0][i].first] = g[0][i].second; 44 } 45 vis[0] = true; 46 d[0] = 0; 47 48 while(1){ 49 // int mmm = inf, id; 50 // for(int j = 0; j <= n; j++){ 51 // if(d[j] < mmm && !vis[j]){ 52 // mmm = d[j]; 53 // id = j; 54 // } 55 // } 56 int id = findmin(); 57 if(id == -1)break; 58 vis[id] = true; 59 for(int j = 0; j < g[id].size(); j++){ 60 int v = g[id][j].first, t = g[id][j].second; 61 if(d[id] + t < d[v]){ 62 d[v] = d[id] + t; 63 } 64 } 65 66 } 67 } 68 69 int bring, take; 70 int ans_bring = inf, ans_take = inf; 71 vector<int>path, ans_path; 72 void dfs(int u) 73 { 74 if(u == spro){ 75 if(ans_bring > bring || ans_bring == bring && ans_take > take){ 76 ans_bring = bring; 77 ans_take = take; 78 ans_path = path; 79 return; 80 } 81 } 82 for(int i = 0; i < g[u].size(); i++){ 83 int v = g[u][i].first, t = g[u][i].second; 84 int tmpbring = bring, tmptake = take; 85 86 if(!vis[v] && t + d[u] == d[v]){ 87 vis[v] = true; 88 path.push_back(v); 89 take += bike_num[v]; 90 if(take < 0){ 91 bring -= take; 92 take = 0; 93 } 94 dfs(v); 95 vis[v] = false; 96 path.pop_back(); 97 bring = tmpbring; 98 take = tmptake; 99 } 100 } 101 } 102 103 int main() 104 { 105 scanf("%d%d%d%d", &cmax, &n, &spro, &m); 106 perf = cmax / 2; 107 for(int i = 1; i <= n; i++){ 108 scanf("%d", &bike_num[i]); 109 bike_num[i] -= perf; 110 } 111 for(int i = 0; i < m; i++){ 112 int u, v, t; 113 scanf("%d%d%d", &u, &v, &t); 114 g[u].push_back(make_pair(v, t)); 115 g[v].push_back(make_pair(u, t)); 116 } 117 118 dijkstra(); 119 //cout<<d[spro]<<endl; 120 memset(vis, 0, sizeof(vis)); 121 vis[0] = true; 122 dfs(0); 123 124 printf("%d 0", ans_bring); 125 for(int i = 0; i < ans_path.size(); i++){ 126 printf("->%d", ans_path[i]); 127 } 128 printf(" %d\n", ans_take); 129 130 return 0; 131 }
转载于:https://www.cnblogs.com/wyboooo/p/10534027.html
PAT1018 Public Bike Management【dfs】【最短路】相关推荐
- 【PAT - 甲级 - 1018】Public Bike Management (带权最短路,多条最短路中加条件,DFS)
题干: 链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f 来源:牛客网 There is a ...
- PAT(甲级)渡劫(一)-Public Bike Management
PAT(甲级)渡劫(一)-Public Bike Management 题目描述: There is a public bike service in Hangzhou City which prov ...
- PAT 甲级 1018. Public Bike Management
原题传送门 此题就是理解题意很麻烦- dfs或者 dijkstra dfs: #include <iostream> #include <vector> using names ...
- 1018 Public Bike Management (30 分) 【难度: 难 / 知识点: 图论 最短路 图的遍历】
https://pintia.cn/problem-sets/994805342720868352/problems/994805489282433024 需要注意的是,往回拉的车,是不可以补我们去的 ...
- PAT 甲级 1018 Public Bike Management
目录 Dijstra+堆优化+DFS SFPA+DFS Dijstra+堆优化+DFS priority_queue 单词要拼对,哈哈. #include <bits/stdc++.h> ...
- HDU多校3 - 6797 Tokitsukaze and Rescue(dfs+最短路)
题目链接:点击查看 题目大意:给出一张无向完全图,现在要求删除 k 条边,问删除后的最短路的最大值是多少,k 最大是 5 题目分析:很玄学的一道题,数据范围非常小且时间给了 8 秒,比赛时我直接暴力贪 ...
- PAT甲级题目翻译+答案 AcWing(图论)
1003 Emergency (25 分) 题意 :求无向图中最短路的数量,以及在最短路情况下,点权之和最大是多少 思路 :dijkstra的扩展一般在第三步"用t更新其它点":s ...
- PAT甲级训练合集(1-70)
本章题解跳转 考点 P1001 数字的数组表示和处理 P1002 多项式的数组表示和处理 P1003 深度优先搜素 P1004 深度优先搜素 P1005 哈希表 P1006 P1007 数组子区间求和 ...
- 【PAT甲级】A1001-A1050刷题记录
文章目录 A1001 A+B Format (20 分) 0.25 ★(一元多项式加法) A1002 A+B for Polynomials (25 分) 0.21 (单源最短路Dijkstra+边权 ...
- PAT甲级真题目录(按题型整理)(转自柳神)
转载自:https://www.liuchuo.net/archives/2502?tdsourcetag=s_pcqq_aiomsg 最短路径 1003. Emergency (25)-PAT甲级真 ...
最新文章
- SEO内部链接优化的技巧
- ClickHouse 系列教程五:多种连接方法
- MySQL 优化上来就分库分表?面试官:根本不懂底层原理!
- iOS应用代码注入防护
- spring 获取cookies_springMVC操作cookie和session
- Google电子地图基础及应用
- 如何成为一个优秀的高级C++程序员
- html超链接使用d,HTML图像的调用和超链接
- js生成批次号_一文知晓MES系统中的批次管控功能
- centos软件软件包
- IDEA2018部署jeesite3完美运行教程
- 百花开放笑声甜_“开源萌宠”庆六一
- 计算机键盘上范的怎么点击,微信怎么用键盘最小化 电脑最小化键盘怎么按
- windows10电脑发现不了网络计算机,Win10电脑无法开启网络发现怎么解决?
- GitHub 用户专属福利,实际到账 3K+,Namebase Airdrop
- 数据可视化第八章使用matplotlib绘制高级图表
- 五、需求分析建模之数据库建模
- Java 基础篇(一)基本概念
- 使用telnet检测网络丢包情况
- IdentityServer4 DiscoveryClient找不到