1018 Public Bike Management 结题记录(dfs剪枝)

个人觉得直接放入代码是最管用的。

其他方法类似,题意请参考其他博主。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 50;

int maxn = 2000000000;
int c, n, ed, s[N], m, minlen, needn, backn, pre[N];
bool flag, book[N];
vector<pair<int, int > > e[N];

inline void dfs(int u, int points, int maxneed, int stores, int len)
{
    if (len > minlen) return ;
    int nd = points * c / 2 - stores;
    
    maxneed = max(maxneed, max(0, nd));

    if (u == ed) {
        int tneedn, tbackn;
        if (nd <= 0) {
            // dont need
            tneedn = maxneed; tbackn = -nd + maxneed;
        } else {
            // need;
            tneedn = max(maxneed, nd); tbackn = 0;
        }
        if (len == minlen) {
            if (needn > tneedn || (needn == tneedn && backn > tbackn)) {
                needn = tneedn; backn = tbackn;
            } 

        } else if (minlen > len) {
            minlen = len; needn = tneedn; backn = tbackn;
        }
        return ;
    }

    for (int i = 0; i < e[u].size(); i++) {
        int v = e[u][i].first, w = e[u][i].second;
        if (book[v]) continue;
        book[v] = true;
        dfs(v, points + 1, maxneed, stores + s[v], len + w);
        book[v] = false;
    }
}

inline void dfs2(int u, int points, int maxneed, int stores, int len)
{
    if (flag) return ;
    if (len > minlen) return ;

    int nd = points * c / 2 - stores;
    maxneed = max(maxneed, max(0, nd));

    if (u == ed) {
        int tneedn, tbackn;
        if (nd <= 0) {
            // dont need
            tneedn = maxneed; tbackn = -nd + maxneed;
        } else {
            // need;
            tneedn = max(maxneed, nd); tbackn = 0;
        }
        if (len == minlen) {
            if (tneedn == needn && tbackn == backn) {
                // puts("test 1");
                flag = true;
            }
        } 
        return ;
    }

    for (int i = 0; i < e[u].size(); i++) {
        int v = e[u][i].first, w = e[u][i].second;
        if (book[v]) continue;
        book[v] = true;
        pre[v] = u;
        dfs2(v, points + 1, maxneed, stores + s[v], len + w);
        if (flag) return ;
        book[v] = false;
    }
}

signed main()
{
    scanf("%d%d%d%d", &c, &n, &ed, &m);

    for (int i = 1; i <= n; i++) scanf("%d", &s[i]);

    while (m--) {
        int u, v, w; scanf("%d%d%d", &u, &v, &w);
        e[u].push_back({v, w});
        e[v].push_back({u, w});
    }
    minlen = maxn, needn = maxn, backn = maxn;
    book[0] = true;
    dfs(0, 0, 0, 0, 0);

    // printf("%d %d %d\n", minlen, needn, backn);

    memset(book, 0, sizeof book);
    book[0] = true;
    dfs2(0, 0, 0, 0, 0);

    vector<int > res;
    while (ed != 0) {
        res.push_back(ed); ed = pre[ed];
    }
    
    printf("%d %d", needn, 0);

    for (int i = res.size() - 1; i >= 0; i--) {
        printf("->%d", res[i]);
    }

    printf(" %d\n", backn);

    return 0;
}
相关推荐
会员源码网9 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing10 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader10 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱13 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng89714 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶