首页 > 其他分享 >1018 Public Bike Management(多条最短路径,dijkstra+dfs+回溯)

1018 Public Bike Management(多条最短路径,dijkstra+dfs+回溯)

时间:2024-11-15 21:20:26浏览次数:1  
标签:Management int back dfs dijkstra vector send child dis

 该题考查多条最短路径的计算,对比单条最短路,主要有两点不同:

1.在dijkstra算法中记录每个结点的所有相同最短距离的前结点

2.在dfs找多条最短路径时需要回溯状态

拿到所有最短路径以后,我们根据题意去获取相应的结果即可

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 int c, n, s, m;
  4 typedef pair<int, int> pii;
  5 vector<int> number(505);
  6 vector<pii> graph[505];
  7 vector<bool> visited(505, false);
  8 vector<bool> dfs_vis(505, false);
  9 vector<int> dis(505, 0x3f3f3f3f);
 10 vector<int> record[505]; //record[i]表示最短路径上到i点之前的点
 11 set<pii> minHeap;
 12 vector<vector<int>> paths;
 13 
 14 void dijkstra() {
 15     dis[0] = 0;
 16     minHeap.insert(make_pair(0, 0));
 17     while(!minHeap.empty()) {
 18         auto node = minHeap.begin();
 19         int root = node -> second;
 20         visited[root] = true;
 21         minHeap.erase(node);
 22         for (auto i : graph[root]) {
 23             int child = i.first;
 24             int val = i.second;
 25             if (!visited[child]) {
 26                 if (dis[child] > dis[root] + val) {
 27                     minHeap.erase(make_pair(dis[child], child));
 28                     dis[child] = dis[root] + val;
 29                     minHeap.insert(make_pair(dis[child], child));
 30                     //只有一个距离最短的前结点
 31                     record[child].clear();
 32                     record[child].push_back(root);
 33                 } else if (dis[child] == dis[root] + val) {
 34                     //当存在多个距离相同的前结点时,一并记录到record数组中
 35                     record[child].push_back(root);
 36                 }
 37             }
 38         }
 39     }
 40 }
 41 //根据record进行遍历,注意record中记录的是前结点,所以这时要从问题站向PBMC遍历
 42 void dfs(int p, vector<int> path) { 
 43     path.push_back(p);
 44     dfs_vis[p] = true;
 45     if (p == 0) { //到达PBMC,保存当前路径
 46         paths.push_back(path);
 47         return;
 48     }
 49     for (auto i : record[p]) {
 50         if (!dfs_vis[i]) {
 51             vector<int> temp = path; //保留当前path信息
 52             dfs(i, temp);
 53             dfs_vis[i] = false; //回溯
 54         }
 55     }
 56     
 57 }
 58 int main() {
 59     cin >> c >> n >> s >> m;
 60     for (int i = 1; i <= n; ++ i) {
 61         cin >> number[i];
 62     }
 63     for (int i = 0; i < m; ++ i) {
 64         int si, sj, t;
 65         cin >> si >> sj >> t;
 66         graph[si].push_back(make_pair(sj, t));
 67         graph[sj].push_back(make_pair(si, t));
 68     }
 69     dijkstra();
 70     
 71     vector<int> temp;
 72     dfs(s, temp);
 73     
 74     int pc = c / 2; //完美情况
 75     int min_send = INT32_MAX, min_back = INT32_MAX;
 76     vector<int> res; //记录最终路径
 77     
 78     // 计算所有最短路径的send和back数量
 79     for (auto i : paths) {
 80         int send = 0; //需要从PBMC发出的单车数量
 81         int now = 0; //目前PBMCer手里有的单车数量
 82         for (auto j = ++(i.rbegin()); j != i.rend(); ++ j) {
 83             int station = *j;
 84             if (number[station] >= pc) { //站里有多的单车
 85                 now += number[station] - pc; //多的单车给PBMCer
 86             } else { //站里单车不够
 87                 if (now < pc - number[station]) { //加上PBMCer手里的也依旧不够
 88                     send += pc - number[station] - now;
 89                     now = 0;
 90                 } else { //PBMCer手里的够分
 91                     now -= pc - number[station];
 92                 }
 93             }
 94         }
 95         if (send < min_send) {
 96             min_send = send;
 97             res = i;
 98             min_back = now;
 99         } else if (send == min_send) {
100             if (now < min_back) {
101                 res = i;
102                 min_back = now;
103             }
104         }
105     }
106     
107     cout << min_send << " ";
108     for (auto i = res.rbegin(); i != res.rend();) {
109         cout << *i;
110         if (++ i != res.rend()) {
111             cout << "->";
112         }
113     }
114     cout << " " << min_back << endl; 
115 }

 

标签:Management,int,back,dfs,dijkstra,vector,send,child,dis
From: https://www.cnblogs.com/coderhrz/p/18548670

相关文章

  • 学习笔记(算法)——路径之谜(蓝桥杯官网)(dfs,回溯)
    学习+1学习目标:蓝桥杯省奖学习内容:每日一题题目源于蓝桥杯官网题目描述解题思路1.先定义最大行列值,输入行列值,行列靶数,答案数组,访问标记数组,辅助数组2.定义dfs(深度优先搜索)函数2.1记录当前位置2.2如果到达右下角&&行列只剩一靶2.2.1做循环:如果前面的靶子都打......
  • 计蒜客:圣诞树(dijkstra,特殊的生成树)
     基础原理:特殊的生成树给定一张无向图,其中边权都是正数,你需要求出总代价最小的生成树,生成树上每条边 (u,v)(u,v) 的代价为 w(u,v)∗count(v)w(u,v)∗count(v),其中 w(u,v)w(u,v) 为边 (u,v)(u,v) 的权值,count(v)count(v) 是 vv 所在子树的结点数总和。解法:虽然看起......
  • 2025年工程管理与安全工程国际学术会议 (EMSE 2025) 2025 International Conference
    重要信息官网:https://ais.cn/u/vEbMBz......
  • 基于java+springboot的Vehicle management系统网站
    课题说明基于Java+SpringBoot的Vehiclemanagement系统网站是一款专门用于车辆管理的综合性网络平台。该网站可实现车辆基本信息管理,详细记录车辆型号、车架号、发动机号、购置日期、颜色等内容,方便随时查询和更新。车辆状态跟踪功能可标记车辆是处于闲置、使用中、......
  • error: NU1100: 无法解析 net8.0 的“System.Management.Automation (>= 7.2.0)”。
    前言最近,在使用Net调用PowerShell,碰到了一个很不常见的错误,记录一下,也许有朋友会遇到,希望有所帮助。正文错误截图如下,其实很奇怪,一样的代码,有些地方报错,有些没事。2.文字版本的错误,方便复制粘贴,如下:MicrosoftWindows[版本10.0.22000.2538](c)Micr......
  • 在 Windows 系统中,DFS (Distributed File System) 是一种用于文件共享和管理的技术,能
    在Windows系统中,DFS(DistributedFileSystem)是一种用于文件共享和管理的技术,能够让多个服务器上的共享文件夹(共享资源)通过一个统一的命名空间来访问。DFS主要通过DFS命名空间和DFS复制这两个组件来实现。DFS相关命令和功能在Windows中,DFS相关的命令通常是通过......
  • POLIR-Society-Organization-Management: “How”-关系网络+组织建设+目标: 计划:管人:
    POLIR-Society-Organization-Management:“How”沟通+关系网络Object的Role:Internalboss/上级:Outcome,平级:Team/Organization员工:RoleExternalCustomer:7P+RelationshipSupplierCompetetorIndividualGovernment组织建设分辨好坏对错是非目......
  • SQL Server Management Studio闪退,以及低版本还原高版本数据库
    求助这是我现有的SSMS版本安装了2019的和2022的SQL数据库2019的数据库,生成脚本时一切正常2022的数据库,生成脚本时闪退这个解决办法是安装高版本的SSMS吗?因为我需要低版本还原高版本数据库因为项目上买的是2022的数据库,我本地有2019和2022的,要把数据库发给同事,他的版......
  • Nginx代理访问RabbitMQ Management UI
    RabbitMQ官方文档说明如下:UsingaReverseProxyinfrontoftheHTTPAPIItmaybenecessarytoputareverseproxyinfrontofaRabbitMQcluster.ReverseproxysetupforRabbitMQmayrequirecarefulhandlingofencodedslashesinpathsifdefaultvirtualhos......
  • 计蒜客:骑车比赛(Dijkstra)
     学习堆优化的写法1#include<bits/stdc++.h>2usingnamespacestd;3intn,m,a,b,c;4typedefpair<int,int>pii;//first表示距离,second表示节点号5vector<pii>graph[1005];6set<pii>minHeap;7vector<int>dis(1005,INT32_MAX);......