题目链接

http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf

题意

求111到n" role="presentation" style="position: relative;">nnn的最短路,最短路上只计算前kkk大的边。

题解

这道题的操作很骚,算法如下:
遍历每条边x" role="presentation" style="position: relative;">xxx,并把图中所有的边的权值都减去该边的权值xxx,如果变成负数,那么就置0" role="presentation" style="position: relative;">000,并将跑出来的值dis[n]+k∗xdis[n]+k∗xdis[n]+k*x就是这次的答案,对所有的答案取最小值,并且与原始图的dis[n]dis[n]dis[n]取最小值,得到的结果就是最终答案。

正确性证明:
1. 假设最终的最短路中有大于等于kkk条边,并设第k" role="presentation" style="position: relative;">kkk大的边长度为xxx。
那么该路径上所有的边减去x" role="presentation" style="position: relative;">xxx,之后跑最短路得到dis[n]dis[n]dis[n],那么dis[n]+k∗xdis[n]+k∗xdis[n]+k*x就是该路径的“长度”,就是最终答案,并且这个数一定会出现在比较中。
而对于其他的路径,如果减去的xxx不是该路径的第k" role="presentation" style="position: relative;">kkk大的边的时候,该路径的值dis[n]+k∗xdis[n]+k∗xdis[n]+k*x一定不会比该路径的“长度”小,出现在比较中不会对最终答案造成影响。
2. 假设最短路中有小于k条边,那么原图中跑最短路的dis[n]dis[n]dis[n]一定是最小的。

注意,此题用spfa超时,用dijkstra也有稍微优化一下才行。

代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 3007;
vector<int> G[maxn];
typedef long long ll;
typedef pair<ll,int> pii;
const ll inf = 1e18;
int U[maxn],V[maxn];long long W[maxn];
int n,m,k;
int vis[maxn];ll dis[maxn];
#define pr(x) cout<<#x<<":"<<x<<endl
/*
ll spfa(ll x){memset(vis,0,sizeof(vis));for(int i = 1;i <= n;++i) dis[i] = inf;queue<int> Q;vis[1] = 1;Q.push(1);dis[1] = 0;while(!Q.empty()){int u = Q.front();Q.pop();vis[u] = 0;for(auto e : G[u]){int v = U[e]^V[e]^u;ll w = W[e] - x;w = max(0ll,w);if(dis[v] > dis[u] + w){if(!vis[v]) Q.push(v);dis[v] = dis[u] + w;vis[v] = 1;}}}return dis[n];
}
*/
ll dij(ll x){priority_queue<pii,vector<pii>,greater<pii> > Q;for(int i = 1;i <= n;++i) dis[i] = inf;dis[1] = 0;Q.push({0,1});while(!Q.empty()){pii p = Q.top();Q.pop();int u = p.second;if(p.first > dis[u]) continue;for(int e : G[u]){int v = u ^ U[e] ^ V[e];ll w = W[e] - x;w = max(0ll,w);if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;Q.push({dis[v],v});}}}return dis[n];
}
int main(){cin>>n>>m>>k;for(int i = 0;i < m;++i){int u,v;long long w;scanf("%d %d %lld",&u,&v,&w);U[i] = u,V[i] = v,W[i] = w;G[u].push_back(i);G[v].push_back(i);}ll ans = dij(0);for(int i = 0;i < m;++i){ll res = dij(W[i])+k*W[i];ans = min(ans,res);}printf("%lld\n",ans);return 0;
}

一道有趣的最短路 NEERC2017 Journey from Petersburg to Moscow相关推荐

  1. Codeforces Gym 101630J Journey from Petersburg to Moscow (最短路)

    题目链接 http://codeforces.com/gym/101630/attachments 题解 zyb学长的题. 先枚举第\(k\)大的边权,设其边权为\(x\),然后把每条边边权减掉\(x ...

  2. [CF_GYM101630J]Journey from Petersburg to Moscow

    题目 题目背景 给生者的忠告: 不要踏进 狗熊岭 半步.在这里的人只有两种:被熊踩死的,和被狗咬死的. 如果你已经进来了,那么不要直视狗的眼睛.它的眼睛有一种魔力,可以将你的视线牢牢吸引住:在它的眼睛 ...

  3. 一道有趣的啤酒趣味题

    一道有趣的啤酒趣味题 试题 10元钱 2元钱,买1瓶啤酒 2个空瓶,换1瓶啤酒 4个瓶盖,换1瓶啤酒 第一步: 10元,先买了5瓶 第二步: 得到 5个空瓶: 5个瓶盖: 4个空瓶,可以换2瓶: 剩下 ...

  4. 一道有趣的最长子序列问题

    一道有趣的最长子序列问题 – 潘登同学的金融经济学笔记 文章目录 一道有趣的最长子序列问题 -- 潘登同学的金融经济学笔记 来源 求解 递推公式 算法实现 来源 前几天在刷视频的时候,发现了这样一道题 ...

  5. 一道有趣的大厂测试面试题,你能用 Python or Shell 解答吗?

    本文是测试开发工程师 Venn 同学面试某互联网名企遇到的一道面试题目,首发于 Testerhome 社区,引发了有趣的讨论和解答,供各位测试同学参考.链接:https://testerhome.co ...

  6. 一道有趣的数学题(一)

    前段时间看到了一道十分有趣的数学题,如下 x + y + z = 1 x 2 + y 2 + z 2 = 2 x 3 + y 3 + z 3 = 3 ⋯ x 5 + y 5 + z 5 = ? \be ...

  7. 一道有趣的sql题,统计复旦用户8月练题情况

    这是一道非常有趣的sql题,第一部分是题的描述,第二部分是题解(tips:右上角有个小目录). 不妨看完题目先思考一下,或者实际运行一下.也可直接从题解看起,题解并非直述答案,而是从每一个sql知识点 ...

  8. java 有意思面试题_一道有趣的Java面试题

    一个鸡蛋从第N层及以上的楼层落下来会摔破? 现在很多大型IT企业在面试时都喜欢问一些智力相关的题目,虽然智力面试题在面试笔试中占的比例不大,但很多时候,面试环节中智力题往往会成为我们拿offer的最大 ...

  9. 一道有趣的数字填空题

    一道数字填空题 将1-8填入以上空格中,找出所有满足条件的组合. 分析: 数值范围:1234-8765.利用枚举法,根据题意,乘数是5,最后一位数必定是5,所以可知,8765/5=1753.即乘子最大 ...

最新文章

  1. 面试:说说你对 Java 中 final 的理解?
  2. web页面到ajax,页面使用ajax加载页面后如果运行其中的js,webpack如何多页面展示...
  3. SAP Cloud for Customer的产品主数据通过PI同步到CRM
  4. python linux 优化_Linux性能优化(一)
  5. 什么导致了交换机端口呈现err-disable状态?
  6. Java中的Object类的toString()方法,equals()方法
  7. 【干货】从数字化洞察新消费趋势看数字化如何赋能企业.pdf(附下载链接)
  8. AT0 Intrudoction
  9. 20171208校内训练
  10. libRTMP 整体说明
  11. SGD(随机梯度下降算法)的缺点
  12. obspy中文教程(六)
  13. 设计模式之简单工厂模式和抽象工厂模式
  14. Windows把内存设置为0无法开机怎么办
  15. 重整晋商雄风,再现汇通天下 -------《晋商》阅读笔记第5-6章
  16. 第九届蓝桥杯国赛 调手表
  17. 2017-9-13 NOIP模拟赛[xxy]
  18. perl php-serialization install,如何在PHP中反序列化Perl Data :: Dumper输出
  19. xp系统链接不上宽带连接服务器,XP系统网络连接正常却上不了网怎么解决
  20. 为TextView控件的文字内容添加中划线、下划线方法

热门文章

  1. 服务器机房 维护,服务器机房建设与管理维护.pdf
  2. php 设置excel格式,php 操作excel文件的方法小结
  3. vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期
  4. 「软件项目管理」一文详解软件项目管理概述
  5. 解决浏览器存储问题,不得不了解的cookie,localStorage和sessionStorage
  6. 简述tcp协议三报文握手过程_TCP协议中的三次握手和四次挥手(图解)
  7. [C++11]final关键字的使用
  8. How many ways HDU - 1978(记忆化搜索关于求多少种方式模板)
  9. oracle有入参的试图,Oracle 带参视图
  10. 数据结构---邻接表的DFS