思路:你的答案必须满足三个条件:

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)的更多相关文章

  1. pat Public Bike Management (30)

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

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

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

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

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

  5. PAT 1018 Public Bike Management[难]

    链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018  Public ...

  6. PAT甲级1018. Public Bike Management

    PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...

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

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

  8. pat 甲级 Public Bike Management

    Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...

  9. Pat(Advanced Level)Practice--1018(Public Bike Management)

    Pat1018代码 题目描写叙述: There is a public bike service in Hangzhou City which provides great convenience t ...

随机推荐

  1. CentOS7.3 ARM虚拟机扩容系统磁盘

    由于扩容磁盘的操作非同小可,一旦哪一步出现问题,就会导致分区损坏,数据丢失等一系列严重的问题,因此建议:在进行虚拟机分区扩容之前,一定要备份重要数据文件,并且先在测试机上验证以下步骤,再应用于您的生产 ...

  2. linux_DNS

    linux其配置文件 : /etc/resolv.conf nameserver 223.5.5.5 nameserver 223.6.6.6 # 这两个解析地址为阿里云解析地址,格式也是这样 什么是 ...

  3. AI_深度学习概论

    什么是是神经网络? 假如有6间房屋的数据集,已知房子的面积,单位是平方米或平方英尺,已知房子的价格.如果通过这6间房子的价格和房子的面积,预测房子的价格,首先要建立起一个数据模型 ,x轴为价格,y轴为 ...

  4. background是什么样式?

    background是什么样式? 给标签添加背景图片 分为: background: url("图片路径");    #添加图片 background-position: xpx ...

  5. nodejs爬虫笔记(五)---利用nightmare模拟点击下一页

    目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题 ...

  6. Zabbix系统数据采集方法总结

    转:http://www.blog.chinaunix.net/uid-9411004-id-4115731.html 老文章,直接拿来用了,官网也有最新分类,没高兴翻译 在Zabbix系统中有多达十 ...

  7. 多对多中间表详解 -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  8. FC经典游戏还原之:松鼠大作战2

    版权声明:本文原创发布于博客园"优梦创客"的博客空间(id:raymondking123) 原帖地址:http://www.cnblogs.com/raymondking123/p ...

  9. VBA小技巧

    运用VBA时,可以构造一些函数去实现诸如printf的方便函数. Public Function printf(mask As String, ParamArray tokens()) As Stri ...

  10. [搬运] DotNetAnywhere:可供选择的 .NET 运行时

    原文 : DotNetAnywhere: An Alternative .NET Runtime 作者 : Matt Warren 译者 : 张很水 我最近在收听一个名为DotNetRock 的优质播 ...