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

有什么做衣服的网站吗天津市建筑信息平台

有什么做衣服的网站吗,天津市建筑信息平台,电商网站建设价格,wordpress经典博客主题目录 题目算法标签: 最短路, 优化, 线段树思路代码*提示 题目 P1186 玛丽卡 算法标签: 最短路, 优化, 线段树 思路 根据题意, 计算的是删除任意一条边的最短路的最大值, 很明显删除最短路径以外的边才会对最短路有影响, 暴力的方法就是删除所有边, 每次删除一条边计算依次最…

题目

P1186 玛丽卡

算法标签: 最短路, 优化, 线段树

思路

根据题意, 计算的是删除任意一条边的最短路的最大值, 很明显删除最短路径以外的边才会对最短路有影响, 暴力的方法就是删除所有边, 每次删除一条边计算依次最短路
不难发现, 最终删边后的路径一定经过至少一条删边前最短路径之外的边,那么可以考虑经过一条确定边的最短路径
具体的算法思路

  1. 计算从节点 1 1 1 n n n的最短路径 d 1 d_1 d1, 计算从节点 n n n到其他节点的最短路径 d 2 d_2 d2
  2. 找到原最短路径的所有节点和边
  3. 对于每个非最短路径的边 ( u , v ) (u, v) (u,v), 计算能替代原最短路的哪些边
  4. 使用线段树维护每条边被删除后的最小替代值
  5. 计算最大值

时间复杂度 O ( n 2 + m l o g n ) O(n ^ 2 + m log n) O(n2+mlogn)

代码

#include <bits/stdc++.h>using namespace std;typedef pair<int, int> PII;
const int N = 1010, INF = 0x3f3f3f3f;int n, m, w[N][N];
int dist_s[N], dist_t[N];
bool vis[N];
int tr[N << 2];
int ans;
int fa[N], pre[N], id[N], cnt;void dijkstra(int s, int d[]) {priority_queue<PII, vector<PII>, greater<>> q;memset(d, 0x3f, sizeof(int) * (n + 1));memset(vis, false, sizeof vis);d[s] = 0;q.push({0, s});while (!q.empty()) {auto [dis, u] = q.top();q.pop();if (vis[u]) continue;vis[u] = true;for (int v = 1; v <= n; ++v) {if (w[u][v] == INF) continue;if (d[u] + w[u][v] < d[v]) {d[v] = d[u] + w[u][v];if (s == 1) pre[v] = u;q.push({d[v], v});}}}
}int find(int u) {if (fa[u] != u) fa[u] = find(fa[u]);return fa[u];
}void build(int u, int l, int r) {tr[u] = INF;if (l == r) return;int mid = (l + r) >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);
}void add_tag(int u, int val) {tr[u] = min(tr[u], val);
}void push_down(int u) {if (tr[u] != INF) {add_tag(u << 1, tr[u]);add_tag(u << 1 | 1, tr[u]);tr[u] = INF;}
}void update(int u, int l, int r, int ql, int qr, int val) {if (l >= ql && r <= qr) {return add_tag(u, val);}push_down(u);int mid = (l + r) >> 1;if (ql <= mid) update(u << 1, l, mid, ql, qr, val);if (qr > mid) update(u << 1 | 1, mid + 1, r, ql, qr, val);
}void query(int u, int l, int r) {if (l == r) {ans = max(ans, tr[u]);return;}push_down(u);int mid = (l + r) >> 1;query(u << 1, l, mid);query(u << 1 | 1, mid + 1, r);
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;memset(w, 0x3f, sizeof w);for (int i = 0; i < m; ++i) {int u, v, val;cin >> u >> v >> val;if (w[u][v] > val) {w[u][v] = w[v][u] = val;}}dijkstra(1, dist_s);dijkstra(n, dist_t);for (int i = 1; i <= n; ++i) fa[i] = pre[i];// 从n向1号节点为每个节点分配编号for (int i = n; i != 0; i = pre[i]) {id[i] = ++cnt;fa[i] = i;// 移除最短路上的边if (pre[i]) {w[i][pre[i]] = w[pre[i]][i] = INF;}}if (cnt == 0) {cout << 0 << endl;return 0;}build(1, 2, cnt);for (int i = 1; i <= n; ++i) {for (int j = i + 1; j <= n; ++j) {// 跳过最短路上的边if (w[i][j] == INF) continue;int u = id[find(i)];int v = id[find(j)];if (u == v) continue;if (v < u) swap(u, v);int nw = min(dist_s[i] + w[i][j] + dist_t[j],dist_s[j] + w[i][j] + dist_t[i]);update(1, 2, cnt, u + 1, v, nw);}}ans = 0;query(1, 2, cnt);if (ans == INF) ans = 0;cout << ans << "\n";return 0;
}

*提示

为什么线段树的区间编号是从 2 2 2开始而不是从 1 1 1开始?
线段树维护的是最短路径上相邻段之间的路径信息, 也就是将最短路按照编号划分为若干段, 假设最短路上有 k k k个点, 那么将最短路划分为 k − 1 k - 1 k1段, 线段树区间就是 [ 2 , k ] [2, k] [2,k]

http://www.dtcms.com/a/490476.html

相关文章:

  • HTB BoardLight writeup(enlightenment 0.23.1 exploit)
  • 唐山网站搭建平台制作计划
  • 智能体面试题:ReAct框架 是什么
  • 泰山派rk3566 wifi基础知识
  • 【无标题】大模型-AIGC技术在文本生成与音频生成领域的应用
  • 渗透测试(2):不安全配置、敏感明文传输、未授权访问
  • 有记事本做简易网站深圳网站设计x程序
  • AI教育开启新篇章
  • 使用bert-base-chinese中文预训练模型,使用 lansinuote/ChnSentiCorp 中文网购评价数据集进行情感分类微调和训练。
  • 国内做设计的网站做视频素材哪个网站好
  • WebGIS包括哪些技术栈?
  • Python全栈(基础篇)——Day13:后端内容(模块详解)
  • 科创企业品牌营销:突破与发展之路
  • Spring Boot 3零基础教程,Spring Boot 指定日志文件位置,笔记21
  • 腾讯云如何建设网站首页北京网站建设联系电话
  • 【JWT漏洞】
  • 2025年10月版集成RagFlow和Dify的医疗知识库自动化查询(安装篇)
  • 苏州手机网站建设多少钱上海小程序定制公司
  • YOLO-V1 与 YOLO-V2 核心技术解析:目标检测的迭代突破
  • HarmonyOS Next 实战技巧集锦
  • 【鸿蒙进阶-7】鸿蒙与web混合开发
  • HarmonyOS Next 快速参考手册
  • 8.list的模拟实现
  • 鸿蒙NEXT按键拦截与监听开发指南
  • 网站建设等级定级企查查官网查企业网页版
  • 【数据结构】基于Floyd算法的最短路径求解
  • 【传感器技术】入门红外传感器技术
  • 成都哪里做网站便宜郴州新网招聘官网
  • 天地一体:卫星互联网与5G/6G的融合之路
  • BCH码编译码仿真与误码率性能分析