当前位置: 首页 > news >正文

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

个人觉得直接放入代码是最管用的。
其他方法类似,题意请参考其他博主。

#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 needtneedn = 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 needtneedn = 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;
}
http://www.lryc.cn/news/150528.html

相关文章:

  • C++ deque底层原理
  • 打破对ChatGPT的依赖以及如何应对ChatGPT的错误和幻觉
  • 【git】【IDEA】在idea中使用git
  • 【设计模式】装饰者模式
  • open cv快速入门系列---数字图像基础
  • 基础知识回顾:借助 SSL/TLS 和 NGINX 进行 Web 流量加密
  • iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款
  • 操作系统清华同步笔记:定义概述+计算机内存和硬盘布局+启动流程顺序+中断、异常和系统调用
  • uniapp 配置并使用 VueX
  • vue v-on 艾特@
  • 【Ajax】发送跨域的POST请求时,浏览器会先发送一次OPTIONS请求,然后才发送原本的POST请求
  • np.numpy, np.reshape, np.cumsum方法速查
  • 七、Kafka-Kraft 模式
  • jvm开启远程调试功能;idea远程debug
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤
  • vue 加载图片不显示
  • Java for循环每次都通过list.size()和 string.length()获取大小性能
  • 面试题 08.01. 三步问题
  • springboot添加SSL证书,支持https与http
  • 【AI】《动手学-深度学习-PyTorch版》笔记(二十):图像增强、微调
  • Vulnhub: Ragnar Lothbrok: 1靶机
  • Ubuntu 20.04 Server配置网络
  • jmeter 线程组
  • springboot集成logback
  • 【从互联网商业思维的角度分析商业模式在国内各大互联网产品的运用】
  • Leetcode394 字符串解码
  • git学习笔记 | 版本管理 - 分支管理
  • pytest---添加自定义命令行参数(pytest_addoption )
  • Flutter开发- iOS 问题CocoaPods not installed or not in valid state
  • leetcode 1207. 独一无二的出现次数