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 ...
随机推荐
- DockerSwarm获取Token与常用命令
一.Token相关 Join tokens是允许一个节点加入集群的密钥.有两种可用的不同的join tokens,一个是用作worker角色,另一个是用作manager角色.在执行swarm join ...
- EAS开发之挂菜单
一:以管理员账号登录 二:挂菜单 点击菜单栏"系统"——客户化菜单编辑——选中上级目录——点击 新建——命名.键入唯一编码,把ui.java类的全路径,拷贝到 ...
- PhpStorm配置SVN的完整方法
1.安装SVN时注意选择“command line client tools"默认是不安装的 2.设置系统环境变量 3.在PhpStorm上设置如下 4.然后通过VCS就可以上传导入你的工程 ...
- Netty实现的一个异步Socket代码
本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio; import com.google.common.util.concurrent.ThreadF ...
- mysql分组用法
--select num from 表 group by num --select num from 表 group by num,nid --特别的:group by 必须在where之后,orde ...
- SpringBoot乱码
第一步: 第一步,约定好传参编码格式 不管是运用httpclient,还是原生http,都要设置传参的编码,为了统一,这儿全部设置为utf-8 第二步,修正application.properties ...
- CoreGraphics之CGContextSaveGState与UIGraphicsPushContext
转至:https://www.jianshu.com/p/be38212c0f79 CoreGraphics与UIKit 这边从iOS绘图教程 提取一些重要的内容. Core Graphics Fra ...
- 单片机成长之路(avr基础篇)- 001 ISP与IAP的区别
ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP(In ...
- C# websocket与html js实现文件发送与接收处理
C# websocket与html js实现文件发送与接收处理 using System; using System.Collections.Generic; using System.Linq; u ...
- Mybatis(二) 全局配置文件详解
这节来说说全局配置文件的东西,非常简单.看一遍就懂了. --WH 一.全部配置内容 SqlMapConfig.xml的配置内容和顺序如下,顺序不能乱.现在来对这些属性的意思一一进行讲解. 二.prop ...