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;
}
相关推荐
Hi李耶11 分钟前
【LeetCode】6-Z字形变换
算法·leetcode·职场和发展
XiaoYu1__20 分钟前
算法进阶·其一:用SCC、Tarjan算法与缩点思想解决有向图的连通关系及2-SAT问题的拓展
算法
小O的算法实验室23 分钟前
AAAI-26,全局相关性学习:通过谱图神经网络增强进化算法
神经网络·学习·算法
段一凡-华北理工大学29 分钟前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化
简信CRM31 分钟前
适合离散制造中小工厂 MES 系统推荐
算法·机器学习·制造
AKA__Zas31 分钟前
芝士算法(前缀和2.0)
java·数据结构·算法·leetcode·哈希算法·学习方法
皓月斯语1 小时前
B3867 [GESP202309 三级] 小杨的储蓄 题解
c++·算法·题解
半夢半醒11 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加菱形、平行四边形、圆角矩形,文本居中显示
算法·c#·流程图
Jerry1 小时前
LeetCode 90. 子集 II
算法
机器学习之心2 小时前
CCD实验设计+SVM代理建模+改进NSGA-II工艺参数多目标优化,MATLAB代码
算法·支持向量机·matlab·多目标优化