zoukankan      html  css  js  c++  java
  • PAT1018. Public Bike Management (30)

    题目传送门

    分析

      Dijstra + DFS搜索,难点在于存在多条最短路径,因此需要用vector<int> pre[N] 记录路径。

    代码

      自己写的有些问题,有两个数据没过,就不放上来了。下面的代码来自于https://www.liuchuo.net/archives/2373

    #include <cstdio>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int inf = 99999999;
    int cmax, n, sp, m;
    int minNeed = inf, minBack = inf;
    int e[510][510], dis[510], weight[510];
    bool visit[510];
    vector<int> pre[510];
    vector<int> path, temppath;
    void dfs(int v) {
        if(v == 0) {
            temppath.push_back(v);
            int need = 0, back = 0;
            for(int i = temppath.size() - 1; i >= 0; i--) {
                int id = temppath[i];
                if(weight[id] > 0) {
                    back += weight[id];
                } else {
                    if(back > (0 - weight[id])) {
                        back += weight[id];
                    } else {
                        need += ((0 - weight[id]) - back);
                        back = 0;
                    }
                }
            }
            if(need < minNeed) {
                minNeed = need;
                minBack = back;
                path = temppath;
            } else if(need == minNeed && back < minBack) {
                minBack = back;
                path = temppath;
            }
            temppath.pop_back();
            return ;
        }
        temppath.push_back(v);
        for(int i = 0; i < pre[v].size(); i++)
            dfs(pre[v][i]);
        temppath.pop_back();
    }
    int main() {
        fill(e[0], e[0] + 510 * 510, inf);
        fill(dis, dis + 510, inf);
        scanf("%d%d%d%d", &cmax, &n, &sp, &m);
        for(int i = 1; i <= n; i++) {
            scanf("%d", &weight[i]);
            weight[i] = weight[i] - cmax / 2;
        }
        for(int i = 0; i < m; i++) {
            int a, b;
            scanf("%d%d", &a, &b);
            scanf("%d", &e[a][b]);
            e[b][a] = e[a][b];
        }
        dis[0] = 0;
        for(int i = 0; i <= n; i++) {
            int u = -1, minn = inf;
            for(int j = 0; j <= n; j++) {
                if(visit[j] == false && dis[j] < minn) {
                    u = j;
                    minn = dis[j];
                }
            }
            if(u == -1) break;
            visit[u] = true;
            for(int v = 0; v <= n; v++) {
                if(visit[v] == false && e[u][v] != inf) {
                    if(dis[v] > dis[u] + e[u][v]) {
                        dis[v] = dis[u] + e[u][v];
                        pre[v].clear();  //这里要记得clear
                        pre[v].push_back(u);
                    }else if(dis[v] == dis[u] + e[u][v]) {
                        pre[v].push_back(u);
                    }
                }
            }
        }
        dfs(sp);
        printf("%d 0", minNeed);
        for(int i = path.size() - 2; i >= 0; i--)
            printf("->%d", path[i]);
        printf(" %d", minBack);
        return 0;
    }
  • 相关阅读:
    省市区三级联动
    VUE项目PC端实现自适应rem
    (课堂笔记)第十三章GLSB涉及负载均衡算法
    LTM理解及配置笔记记录
    实验演示---GSLB部分(DC1)
    F5实验模拟拓扑
    (课堂笔记)第十三章:DNS 全局站点
    AbstractList类_Iterator内部类
    Oracle 时间格式化异常:无效数字
    Maven库镜像
  • 原文地址:https://www.cnblogs.com/starryxsky/p/7152109.html
Copyright © 2011-2022 走看看