PAT1018 Public Bike Management【dfs】【最短路】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805489282433024
题意:
给定一个图,一个目的地和每个节点上的自行车数量。
现在要找到从0到目的地的一条最短路,并且对这条路径上的点的自行车数目进行调度使得每个节点的自行车数量都是某个定值。
可以从前面经过的节点搬运自行车到后面的节点,0号节点的自行车是无穷多的。
如果最短路不唯一,要求找到从0号带出的自行车数量最小的方案。
如果还是不唯一,要求找到带回0号的自行车数量最小的方案。
思路:
刚开始直接就想要同时最优化路径和调度车数量跑dijkstra了。但是这样是不对的。
应该要先完最短路,否则会出现前面的某个节点就出现了最短路相同而选择了另一条车少的但是影响了后面的最短路。
总之就是这样跑出来的最短路,并不是时间最短的。
所以我们应该要先跑最短路,然后再在几条最短路里面搜索他们各自调度自行车的数量。这里用dfs
每次搜索到了目的地就看看是不是比原答案更优。
//#include<bits/stdc++>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#include<queue>
#include<map>
#include<stack>
#include<set> #define LL long long
#define ull unsigned long long
#define inf 0x7f7f7f7f using namespace std; int cmax, n, spro, m, perf;
const int maxn = ;
vector<pair<int, int> > g[maxn];
int bike_num[maxn]; bool vis[maxn];
int d[maxn];
int cnt[maxn];
int prv[maxn]; int findmin()
{
int mmm = inf, id = -;
for(int i = ; i <= n; i++){
if(!vis[i] && d[i] < mmm){
mmm = d[i];
id = i;
}
}
return id;
}
void dijkstra()
{
memset(d, 0x3f, sizeof(d));
for(int i = ; i < g[].size(); i++){
d[g[][i].first] = g[][i].second;
}
vis[] = true;
d[] = ; while(){
// int mmm = inf, id;
// for(int j = 0; j <= n; j++){
// if(d[j] < mmm && !vis[j]){
// mmm = d[j];
// id = j;
// }
// }
int id = findmin();
if(id == -)break;
vis[id] = true;
for(int j = ; j < g[id].size(); j++){
int v = g[id][j].first, t = g[id][j].second;
if(d[id] + t < d[v]){
d[v] = d[id] + t;
}
} }
} int bring, take;
int ans_bring = inf, ans_take = inf;
vector<int>path, ans_path;
void dfs(int u)
{
if(u == spro){
if(ans_bring > bring || ans_bring == bring && ans_take > take){
ans_bring = bring;
ans_take = take;
ans_path = path;
return;
}
}
for(int i = ; i < g[u].size(); i++){
int v = g[u][i].first, t = g[u][i].second;
int tmpbring = bring, tmptake = take; if(!vis[v] && t + d[u] == d[v]){
vis[v] = true;
path.push_back(v);
take += bike_num[v];
if(take < ){
bring -= take;
take = ;
}
dfs(v);
vis[v] = false;
path.pop_back();
bring = tmpbring;
take = tmptake;
}
}
} int main()
{
scanf("%d%d%d%d", &cmax, &n, &spro, &m);
perf = cmax / ;
for(int i = ; i <= n; i++){
scanf("%d", &bike_num[i]);
bike_num[i] -= perf;
}
for(int i = ; i < m; i++){
int u, v, t;
scanf("%d%d%d", &u, &v, &t);
g[u].push_back(make_pair(v, t));
g[v].push_back(make_pair(u, t));
} dijkstra();
//cout<<d[spro]<<endl;
memset(vis, , sizeof(vis));
vis[] = true;
dfs(); printf("%d 0", ans_bring);
for(int i = ; i < ans_path.size(); i++){
printf("->%d", ans_path[i]);
}
printf(" %d\n", ans_take); return ;
}
PAT1018 Public Bike Management【dfs】【最短路】的更多相关文章
- PAT-1018(Public Bike Management)最短路+额外条件+所有最短路中找出满足条件的路径+dijkstra算法
Public Bike Management PAT-1018 使用一个vector来存储所有最短路的前驱结点,再通过使用dfs和一个额外的vector记录每一条路径 #include<iost ...
- PAT-1018 Public Bike Management(dijkstra + dfs)
1018. Public Bike Management There is a public bike service in Hangzhou City which provides great co ...
- PAT Public Bike Management (dfs)
思路:你的答案必须满足三个条件: 1.在所有路径中选择最短的: 2.如果路径相等,则选择从PBMC中送出最少的: 3.如果路径相等且PBMC送出的车也相等,则选择带回最少的. 注意:这题很恶心,你要考 ...
- PAT 1018 Public Bike Management(Dijkstra 最短路)
1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- PAT A1018 Public Bike Management (30 分)——最小路径,溯源,二标尺,DFS
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)
1018 Public Bike Management (30 分) There is a public bike service in Hangzhou City which provides ...
- PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
- A1018. Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- 1018 Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
随机推荐
- Docker CE 镜像源站
sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-proper ...
- cookie 跨域解决方法
1.Nginx 正向和反向代理的区别 正向代理和反向代理的区别:正向代理隐藏真实客户端,反向代理隐藏真实服务端,图示: 2.cookie跨域问题 因为cookie存在跨域问题,其中一个解决方法是,设置 ...
- C语言结构体变量私有化
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...
- 使用Træfɪk(traefik)来加速Qt在线更新
简述 在使用Qt的MaintenanceTool程序进行在线更新的时候遇到一个问题,就是访问download.qt.io实在太慢了,老是失败.所以想使用国内的镜像站来进行更新. 使用Qt的镜像站方法也 ...
- 【原创 Hadoop&Spark 动手实践 11】Spark Streaming 应用与动手实践
[原创 Hadoop&Spark 动手实践 11]Spark Streaming 应用与动手实践 目标: 1. 掌握Spark Streaming的基本原理 2. 完成Spark Stream ...
- [HDFS Manual] CH8 HDFS Snapshots
HDFS Snapshots HDFS Snapshots 1. 概述 1.1 Snapshottable目录 1.2 快照路径 2. 带快照的更新 3. 快照操作 3.1 管理操作 3.2 用户操作 ...
- [HDFS Manual] CH6 HDFS Federation
HDFS Federation HDFS Federation 1 Background 2.多个namenode/namespace 2.1 关键好处 3 联合配置 3.1 配置 3.2 格式化na ...
- Linux系统盘扩容-物理机非虚拟机
# Linux系统盘扩容 ## 了解磁盘分区情况 - `blkid` 查看分区情况- `fdisk -l` 分区表 ## 系统挂载分区 - `/etc/fstab` 启动挂载分区情况 ## 双系统下分 ...
- mysql使用问题记录
Mysql Access denied for user 'root' ERROR 1045 (28000): Access denied for user 'root'@'localhost' (u ...
- WPF ViewModelLocator
在WPF中应用ViewModelLocator <Window x:Class="Demo.Views.MainWindow" ... xmlns:prism="h ...