题目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】【最短路】的更多相关文章

  1. PAT-1018(Public Bike Management)最短路+额外条件+所有最短路中找出满足条件的路径+dijkstra算法

    Public Bike Management PAT-1018 使用一个vector来存储所有最短路的前驱结点,再通过使用dfs和一个额外的vector记录每一条路径 #include<iost ...

  2. PAT-1018 Public Bike Management(dijkstra + dfs)

    1018. Public Bike Management There is a public bike service in Hangzhou City which provides great co ...

  3. PAT Public Bike Management (dfs)

    思路:你的答案必须满足三个条件: 1.在所有路径中选择最短的: 2.如果路径相等,则选择从PBMC中送出最少的: 3.如果路径相等且PBMC送出的车也相等,则选择带回最少的. 注意:这题很恶心,你要考 ...

  4. PAT 1018 Public Bike Management(Dijkstra 最短路)

    1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  5. PAT A1018 Public Bike Management (30 分)——最小路径,溯源,二标尺,DFS

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  6. 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 ...

  7. 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 ...

  8. A1018. Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  9. 1018 Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

随机推荐

  1. WPF 模板绑定父级控件内容

    WPF 模板绑定父级控件内容 <Style TargetType="Button" x:Key="btn"> <Setter Property ...

  2. IEEE754标准的浮点数存储格式

    操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 基本存储格式(从高到低) : Sign + Exponent + Fraction Sign : 符号位 Exponent ...

  3. Docker 的插件式设计

    http://www.tuicool.com/articles/MnIRZvJ http://uzhima.com/2016/08/02/what-is-docker-volume-plugin/ 在 ...

  4. 使用 GeoIP2 获取 IP 的地理位置

    1. 准备工作 数据库 : 解析 IP 地理位置的的数据库来自 GeoLite2 开源数据库:https://dev.maxmind.com/geoip/geoip2/geolite2/ . C 语言 ...

  5. Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -

    mysql -A不预读数据库信息(use dbname 更快)—Reading table information for completion of table and column names Y ...

  6. 程序运行在.Net 4.0低版本上 报“System.NullReferenceException”错误

    因为程序仅在个别机器上出现“ System.NullReferenceException”问题,而在其他机器上一切运行正常,所以认为是环境问题 具体错误信息如下: 2018-09-14 10:12:1 ...

  7. 【20171123】【GITC精华演讲】贝业新兄弟李济宏:如何做到企业信息化建设的加减乘除

    导读 11月23日智慧物流论坛上,贝业新兄弟李济宏分享了<如何做到企业信息化建设的加减乘除>演讲,介绍了如何更好的构建企业信息化系统. 30秒get演讲干货 为什么用户总说系统难用?为什么 ...

  8. 阿里云oss缩略图如何产生读取 超简单 不看后悔(转)

    OSS是使用通过URL尾部的参数指定图片的缩放大小 图片路径后面拼接如下路径: ?x-oss-process=image/[处理类型],x_100,y_50[宽高等参数] ?x-oss-process ...

  9. kafka集群方案教程

    https://www.cnblogs.com/justuntil/p/8033792.html https://www.cnblogs.com/saneri/p/8762168.html 2篇文章结 ...

  10. npm安装package.json中的模块依赖

    npm 一键安装 package.json里的依赖时有2种情况: 1.package.json不存在时 运行命令: npm init可自动创建package.json文件 2.package.json ...