PAT Public Bike Management (dfs)
思路:你的答案必须满足三个条件:
1.在所有路径中选择最短的;
2.如果路径相等,则选择从PBMC中送出最少的;
3.如果路径相等且PBMC送出的车也相等,则选择带回最少的。
注意:这题很恶心,你要考虑–在最后计算发车数和返回车数时,首先要从sp开始反向寻找第一个缺车的站(由于发车是单向的,路径上靠近PBMC的站可以将多出的车交给较远的缺车的站,但较远的站之后不能将多出的车返还给较近的缺车站,其后多出的车最后全部返还给PBMC了,因此发车数要从第一个缺车的站开始往前计算),之后多出的车全部计入返回车辆数
AC代码
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 500+5;
int c, m, n, goal;
int G[maxn][maxn], sta[maxn];
int vis[maxn];
int path[maxn], length, tmp[maxn];
struct res{
int length, send, back;
res() {
this->length = inf;
this->send = inf;
this->back = inf;
}
res(int l, int s, int b) {
this->length = l;
this->send = s;
this->back = b;
}
}ans;
void updatePath(int cnt) {
length = cnt;
for(int i = 0; i < cnt; i++) {
path[i] = tmp[i];
}
}
/*
1.在所有路径中选择最短的;
2.如果路径相等,则选择从PBMC中送出最少的;
3.如果路径相等且PBMC送出的车也相等,则选择带回最少的。
*/
res better(res &a, res &b, int cnt) {
bool update = false;
if(a.length > b.length) {
update = true;
} else if(a.length == b.length){
if(a.send > b.send) {
update = true;
} else if(a.send == b.send) {
if(a.back > b.back) {
update = true;
}
}
}
if(update) {
updatePath(cnt);
return b;
} else {
return a;
}
}
void dfs(int u, int len, int cnt, int send, int back) {
if(len > ans.length) return;
if(u == goal) {
res tp = res(len, send, back);
ans = better(ans, tp, cnt);
return;
}
for(int i = 1; i <= n; i++) {
if(!vis[i] && G[u][i] != -1) {
vis[i] = 1;
tmp[cnt] = i;
if(sta[i] >= c/2) {
dfs(i, len+G[u][i], cnt+1, send, back+sta[i]-c/2);
} else {
int x = c/2 - sta[i];
dfs(i, len+G[u][i], cnt+1, x>back?send+x-back:send, x>back?0:back-x);
}
vis[i] = 0;
}
}
}
void init() {
ans.length = inf;
ans.send = inf;
ans.back = inf;
memset(G, -1, sizeof(G));
memset(vis, 0, sizeof(vis));
}
int main() {
while(scanf("%d%d%d%d", &c, &n, &goal, &m) == 4) {
init();
for(int i = 1; i <= n; i++) {
scanf("%d", &sta[i]);
}
int u, v, cost;
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &cost);
G[u][v] = cost;
G[v][u] = cost;
}
vis[0] = 1;
dfs(0, 0, 0, 0, 0);
printf("%d ", ans.send);
printf("0");
for(int i = 0; i < length; i++) {
printf("->%d", path[i]);
}
printf(" %d\n", ans.back);
}
return 0;
}
如有不当之处欢迎指出!
PAT Public Bike Management (dfs)的更多相关文章
- pat Public Bike Management (30)
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- 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 ...
- PAT 1018 Public Bike Management[难]
链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018 Public ...
- PAT甲级1018. Public Bike Management
PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...
- PAT 1018 Public Bike Management(Dijkstra 最短路)
1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- pat 甲级 Public Bike Management
Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...
- Pat(Advanced Level)Practice--1018(Public Bike Management)
Pat1018代码 题目描写叙述: There is a public bike service in Hangzhou City which provides great convenience t ...
随机推荐
- Django_上传图片和模版获取图片
需求: 在Django中,上传图片,存入数据库中的文件的路径,而不是图片本身,也就是说,图片等数据静态文件都可以放到第三方服务器上,我想在把图片保存到Django本地项目中,并可以通过Django自带 ...
- Mysql之左连接右连接内连接——示例 (转)
下面是两张表 表stu 表tech 1.右连接 当使用右连接语句查询时,返回结果如下: 1 SELECT stu.id,stu.name,stu.classe_name,tech.id,tech.na ...
- CSS——选择器2
1.子选择器 (1).用于指定标签元素的第一代子元素,使用">"号. (2).例子: <style type="text/css"> .foo ...
- Python一些方法的用法集锦
1.range()方法: >>>range(5) [0, 1, 2, 3, 4] >>>a= ["heke","sdsdjs" ...
- Mysql编译安装及优化
采取编译安装的方法,其好处为:编译安装与平台无关,安装的MySQL目录独立,维护起来方便,而且拥有更好的性能. 环境:CentOS release 6.9 (Final) x86_64 1)下载my ...
- Python CRM项目四
实现Django Admin的多对多的复选框效果 效果:左边显示的是未选中的字段,右边显示的是已选中的字段,两边点击的标签可以互相更换 首先在king_admin.py中增加filter_horizo ...
- windows上搭建svn 、 Eclipse上安装svn插件 、 eclipse中如何使用svn
折腾了许久终于搞出来了. svn搭建 一.svn概述 SVN就是用于多个人共同开发同一个项目,共用资源的目的,该文描述了把svn搭建在本地上,和搭建在Eclipse4.5.2上. 二.svn分类 分为 ...
- 模仿spring-aop的功能,利用注解搭建自己的框架。
入JAVA坑7月有余,也尝试自己手动搭建框架,最近对spring aop的这种切面很着迷,为此记录下自己目前搭出来的小小的demo,后续有时间也会继续改进自己的demo.望大神们不吝赐教. 主要还是运 ...
- Trusted Execution Technology (TXT) --- 度量(Measurement)篇
版权声明:本文为博主原创文章,未经博主允许不得转载.http://www.cnblogs.com/tsec/p/8413537.html 0. 导读 TXT基本原理篇介绍了TXT安全度量的基本概念,包 ...
- java导入项目有红色叹号
原因:缺少jar包 解决: 选中项目 -> 右键 -> Build Path -> Configer Builder Path -> 删除掉有错的J ...