题目链接

题目

题目描述

“题目名称只是吸引你来做题的啦,其实和题目没什么卵关系:o(* ̄▽ ̄*)o” —— 历史——殿堂

wpy移情别恋啦,他不喜欢spfa了,现在他喜欢使用dij,但是他又发现了一个新的问题,dij无法跑有负权边的图,于是wpy找到了她的男朋友也就是你来帮忙,为了你晚上的幸福生活,你必须在1秒内帮她解决这个问题,然后蹿到床上。。。balabala(捂脸)。。。。(*/ω\*)

简单来说,有一张n个点,m条边的有向图,请你给每条边确定一个新的边权(不同边之间可以不同),保证对于任意u,v,在新图上的u到v的最短路上的点和原图上最短路上的点相同且顺序不变。

新的边权要求非负。

输入描述

第一行两个整数n,m,表示有n个点,m条边。

接下来m行,每行三个数,u,v,w,表示有一条从u到v。

输出描述

输出m行,每行三个整数u,v,w表示有从u到v的边边权改完后是为w。

ps:按输入顺序输出。

示例1

输入

5 10
1 2 -4383
1 3 -9930
2 4 -7331
1 5 -2175
2 3 11962
2 5 16382
4 5 11420
1 4 37978
3 5 13836
3 4 14617

输出

1 2 0
1 3 0
2 4 0
1 5 0
2 3 17509
2 5 14174
4 5 1881
1 4 49692
3 5 6081
3 4 16401

备注

\(n<=10^3,m<=3*10^3,|w|<=10^9\)

数据保证有解,保证没有负环,保证任意两点间最短路唯一,保证图联通

数据有梯度( 但是出题人也不知道能写什么部分分)

题解

知识点:最短路,数学。

这道题利用了最短路不等式:对于任意边 \(u \to v\) 边权为 \(w\) ,都有 \(dis[v] \leq dis[u] + w\) (因为最短路满足了 \(dis[v]>dis[u]+w\) 必然更新,因此最后一定满足这个不等式)。于是,我们有 \(dis[u]-dis[v]+w \geq 0\) 恒为正。

题目要求我们将边权都改成正的且不影响最短路。换句话说,对于任意相同两个点 \(u,v\) ,我们需要在不改变其所有路径的权值的相对大小的情况下,要让边权都改为正的。因此,边在改正之后的影响,只能等价于对所有路径同时加一个常量。我们猜测将所有路径改为 \(dis[u]-dis[v]+w\) 。

对于 \(u,v\) 的任意路径 \(u \to x_1 \to x_2 \to \cdots \to x_n \to v\) 的权值和为 \(w = w(u,x_1) + \cdots + w(x_n,v)\) 。若改变边权后,则整条路径的权值和变为 \(dis[u] - dis[x_1] + w(u,x_1) + \cdots + dis[x_{n}]-dis[v] + w(x_n,v) = dis[u]-dis[v] + w\) ,即 \(u,v\) 的任意路径都加了常量 \(dis[u] - dis[v]\) ,所有路径的权值相对不变,即保证了最短路不变,并且所有边权都为正。 因此,我们把所有边权改为 \(dis[u]-dis[v] + w\) 即可。

注意,建一个超级源点,保证每个点都有最短路。否则,有可能从单源点没法走到某些点。

时间复杂度 \(O((n+m) \log m)\)

空间复杂度 \(O(n+m)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; template<class T>
struct Graph {
struct edge {
int v, nxt;
T w;
};
int idx;
vector<int> h;
vector<edge> e; Graph(int n, int m):idx(0), h(n + 1), e(m + 1) {}
void init(int n) {
idx = 0;
h.assign(n + 1, 0);
} void add(int u, int v, T w) {
e[++idx] = edge{ v,h[u],w };
h[u] = idx;
}
};
///链式前向星(有权),空间复杂度O(n+m),空间性能最优,时间性能较好,使用较复杂 const int N = 1000 + 7, M = 3000 + 1000 + 7;
Graph<int> g(N, M);
int n, m; bool vis[N];
ll dis[N];
queue<int> q;
void SPFA(int st) {
for (int i = 1;i <= n + 1;i++) dis[i] = 0x3f3f3f3f3f3f3f3f;
dis[st] = 0;
q.push(st);
vis[st] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = g.h[u];i;i = g.e[i].nxt) {
int v = g.e[i].v, w = g.e[i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (!vis[v]) q.push(v), vis[v] = 1;
}
}
}
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
vector<tuple<int, int, int>> ans;
for (int i = 1;i <= m;i++) {
int u, v, w;
cin >> u >> v >> w;
g.add(u, v, w);
ans.push_back({ u,v,w });
}
for (int i = 1;i <= n;i++) g.add(n + 1, i, 0);
SPFA(n + 1);
for (auto [u, v, w] : ans) {
cout << u << ' ' << v << ' ' << w + dis[u] - dis[v] << '\n';
}
return 0;
}

NC20684 wpy的请求的更多相关文章

  1. 【wepy实战】wepy搭建完整项目

    使用小程序框架wepy,搭建完整实战项目.文章将从项目结构.配置.模块等进行逐步分析和学习. 文章适合小程序开发新手以及有经验的小程序developer,不喜勿喷,不吝赐教! 本文为作者原创,转发请标 ...

  2. 【WePY小程序框架实战四】-使用async&await异步请求数据

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...

  3. wepy.request 请求成功但是不进入success和fail方法,及请求传参问题

    1.根据wepy官方给的文档如下,用then拿后台返回的数据,如果用then报错,请先在app.wpy中配置promise. 没有success,fail,complete方法,如若用了也是不会进入方 ...

  4. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  5. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  6. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  7. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  8. nodejs之get/post请求的几种方式

    最近一段时间在学习前端向服务器发送数据和请求数据,下面总结了一下向服务器发送请求用get和post的几种不同请求方式: 1.用form表单的方法:(1)get方法 前端代码: <form act ...

  9. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  10. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

随机推荐

  1. Win10 高效语音输入方案:听写功能 win + H

    win + H 打开听写功能,即可打开语音输入,帮你快速糊完文档 (队友亲测好用)

  2. kafka常用操作

    kafka运维常用查询操作总结以下几点: kafka生产和消费消息测试 发送:bin/kafka-console-producer.sh --broker-list 10.46.200.165:909 ...

  3. 揭秘 Docker 网络:手动实现 Docker 桥接网络

    本文将带领读者探索 Docker 桥接网络模型的内部机制,通过手动实现 veth pair.bridge.iptables 等关键技术,揭示网络背后的运作原理. 如果你对云原生技术充满好奇,想要深入了 ...

  4. SpringBoot实现限流注解

    SpringBoot实现限流注解 在高并发系统中,保护系统的三种方式分别为:缓存,降级和限流. 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率 ...

  5. [转帖]Prometheus-使用python开发exporter

    exporter有很多,但想要特定需求的话,还需自行开发.在这里使用python写一个exporter,用于监控/root下的目录数量. 开发exporter需要使用prometheus_client ...

  6. [转帖]华为OpenEuler欧拉系统添加epel源方法

    https://blog.whsir.com/post-7002.html   由于国产华为OpenEuler欧拉系统的版本命名是22.03.22.03这种,并且在查看版本的路径中是/etc/open ...

  7. [转帖]018 磁盘 IO 性能监控 / 压测工具 (sar、iotop、fio、iostat)

    https://my.oschina.net/u/3113381/blog/5465063   1 sar 命令查看当前磁盘 IO 读写 sar(System Activity Reporter 系统 ...

  8. 一次w3wp出现crash的简单解决方案

    1. 前几天同事求助, 说一台服务器iis出现多次崩溃的现象,重启iis就可以了.  具体原因不明. 之前遇到过类似的问题  感觉最彻底的解决方案是 抓dump然后使用windbg 进行分析. 但是自 ...

  9. 对象数组,如果key中的value相同,不要该项

    <script type="text/javascript"> let arr=[ { gradeId: "498094709437239572", ...

  10. 清空elementui让计数器input-number的默认值

    <el-form-item label="考试时长:" prop="testTimeLong"> <el-input-number style ...