题目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. Git - 生成ssh key步骤以及如何clone所有的远程分支

    https://www.cnblogs.com/gongyuhonglou/p/6922721.html 2. 生成ssh key $ ssh-keygen -t rsa -C “邮箱”按3个回车,密 ...

  2. Deep Learning.ai学习笔记_第一门课_神经网络和深度学习

    目录 前言 第一周(深度学习引言) 第二周(神经网络的编程基础) 第三周(浅层神经网络) 第四周(深层神经网络) 前言 目标: 掌握神经网络的基本概念, 学习如何建立神经网络(包含一个深度神经网络), ...

  3. Swift 拷贝文件夹,实现文件夹内容整体复制

    我们知道,在沙盒内,iOS要拷贝一个文件,可以使用 fileManager.copyItem(atPath: fullPath, toPath: fulltoPath) 方法简单实现,不过当我们要拷贝 ...

  4. 【RS】Collaborative Memory Network for Recommendation Systems - 基于协同记忆网络的推荐系统

    [论文标题]Collaborative Memory Network for Recommendation Systems    (SIGIR'18) [论文作者]—Travis Ebesu (San ...

  5. zsh+on-my-zsh配置教程指南(程序员必备)

    本文以CentOS 7/Mac 为例,介绍zsh的配置使用教程. 准备 查看当前环境shell echo $SHELL <!-- more --> 查看系统自带哪些shell cat /e ...

  6. WWDC 17: 开发者的最初观感

    WWDC 17: 开发者的最初观感 前言 每年的 WWDC 都是 iOS 开发者集体高潮的时刻.第一天的 WWDC 带来了全新的 iOS 11.MacOS.tvOS 和 watchOS,革命性的 AR ...

  7. 程序猿必备的10款超炫酷HTML5 Canvas插件

    1.超炫酷HTML5 Canvas 3D旋转地球动画 这是一款基于HTML5 Canvas的3D地球模拟动画,动画以太空作为背景,地球在太空中旋转,同时我们也可以拖拽鼠标来从不同的角度观察地球.另外我 ...

  8. css实现高度或者宽度不固定的div元素垂直左右居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. python实现类似于Matlab中的magic函数

    参考这篇文章的代码封装了一个类似Matlab中的magic函数,用来生成魔方矩阵. #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy ...

  10. android手机测试中如何查看内存泄露

    (一) 生成.hprof文件生成.hprof 文件的方法有很多,而且Android 的不同版本中生成.hprof 的方式也稍有差别,我使用的版本的是2.1,各个版本中生成.prof 文件的方法请参考: ...