题目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. php读取ini配置文件属性

    ini的内容格式如下,请根据自己的INI,格式修改下段程序. autostart = false font_size = font_color = red =================== fu ...

  2. 天府大讲堂:5G时代的物联网发展趋势与产业变革

    摘要:国家973物联网首席科学家,中科院上海微系统与信息技术研究所副所长,无锡物联网产业研究院院长刘海涛教授讲授的5G时代的物联网发展趋势与产业变革意义深刻.作者根据天府大讲堂听讲内容加工整理所得,旨 ...

  3. PHP异步扩展Swoole笔记(2)

    dispatch_mode, 数据包分发策略 可以选择7种类型,默认为21,轮循模式,收到会轮循分配给每一个Worker进程2,固定模式,根据连接的文件描述符分配Worker.这样可以保证同一个连接发 ...

  4. 基于 Python 官方 GitHub 构建 Python 文档

    最近在学 Python,所以总是在看 Python 的官方文档, https://docs.python.org/2/ 因为祖传基因的影响,我总是喜欢把这些文档保存到本地,不过 Python 的文档实 ...

  5. elasticsearch外网访问设置

    默认情况下安装elasticsearch之后是无法进行外网访问的,可以通过设置来完成这一目的 1.更改配置文件 [***@elk01 ~]$ vim elk/config/elasticsearch. ...

  6. 解决CEF中显示Flash动画弹出安全警告问题

    一. 1.Xilium.CefGlue. CefApp (CefApp.cs文件)类on_before_command_line_processing方法内设置flash路径.版本号等. m_comm ...

  7. 【Vegas原创】MAC下,idea手动maven jar包的方法

    1,到自己的项目目录下 Vegass-MacBook-Air:gms-boyol Vegas$ pwd/Users/Vegas/SynologyDrive/Coding/workspace/gms-b ...

  8. CentOS 7 yum nginx MySQL PHP7 简易环境搭建(精)

    用centos自带的yum源来安装nginx,mysql和php,超级方便,省去编译的麻烦,省去自己配置的麻烦,还能节省非常多的时间. 我们先把yum源换成国内的阿里云镜像源(当然不换也可以),先备份 ...

  9. mschart asp chart 用法,包括前台写法与后台写法,还有click事件,如何触发。

    纯后台动态生成aspchart ,这种方式没办法实现chart中click事件.click事件点击没有反应,用第二种可以实现点击事件. 两种方式实现同一种效果图: 第一种写法:后台动态生成aspcha ...

  10. [k8s]debug模式启动集群&k8s常见报错集合(on the fly)

    debug模式启动-支持sa 集群内(pod访问api)使用443加密 no1 no2 安装flanneld kubelet/kube-proxy m1 安装etcd/ api/contruller/ ...