题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚举每条非树边的两个端点,求一遍这两个点到所有点的最短路.非树边最多21条,所以要求一遍最短路的点最多42个. 另外对于一条边的两个点只求一个就好了.因为要用这条非树边的话它们两个都要经过. //779ms 28900KB #include <queue> #include <cstdio&g…
题目链接:codeforces 1051F The Shortest Statement 题意:\(q\)组询问,求任意两点之间的最短路,图满足\(m-n\leq 20\) 分析:一开始看这道题:floyd?简单 ​ 看下去:\(n\leq 10^5\),有点可怕 ​ 接下去:\(q\leq 10^5\),mmp 题目中十分重要的条件是\(m-n\leq 20\),我们要考虑如何利用好它使得能在\(O(logn)\)左右的时间内求出两点间最短路 由于\(m\)和\(n\)相差不大,我们很容易想到…
传送门 这真是一道一言难尽的题. 首先比赛的时候居然没想出来正解. 其次赛后调试一直调不出来最后发现是depth传错了. 其实这是一道简单题啊. 对于树边直接lca求距离. 由于非树边最多21条. 因此我们对这21条边连接的42个点都跑一次最短路来更新答案的最小值即可. 代码: #include<bits/stdc++.h> #define N 100005 #define ll long long #define pii pair<int,int> #define pli pai…
题目链接: https://codeforces.com/contest/1051/problem/F 题目大意: 给出一张$n$个点,$m$条边的带权无向图,多次询问,每次给出$u,v$,要求输出$u$到$v$的最短距离 $1<=n<=m<=10^5,m-n<=20$ 题解: 显然我们要从$m-n<=20$入手,发现这张图非常的稀疏,所以按照套路我们先随便搞一棵生成树(和kruskal的步骤差不多只是去掉了排序). 当询问两个点$u,v$的最短距离时我们先只考虑树上的点,显…
1051E. Vasya and Big Integers 题意 给出三个大整数\(a,l,r\),定义\(a\)的一种合法的拆分为把\(a\)表示成若干个字符串首位相连,且每个字符串的大小在\(l,r\)之间,求每个字符串不能有前导零,求\(a\)有多少种合法的拆分方案. 题解 不难想到\(dp\),设\(dp_i\)表示前\(i\)个数有多少种合法的拆分方案. \(dp_i=\sum_{j=1}^i dp_{j-1}\)(从\(j+1~i\)拆分的数在\(l,r\)之间) 直接转移是\(O(…
题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \(Solution\) 正反跑两遍Dijkstra.一条边\((u,v,w)\)在最短路上当且仅当\(dis[S][u]+dis[v][T]+w=dis[S][T]\). 一定在最短路上则满足,从\(S\)走最短路到\(u\)的方案数 * 从\(v\)走最短路到\(T\)的方案数 = 从\(S\)到…
I. Move Between Numbers   time limit per test 2.0 s memory limit per test 256 MB input standard input output standard output You are given n magical numbers a1, a2, ..., an, such that the length of each of these numbers is 20 digits. You can move fro…
原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html 题解 接下来说的“边”都指代“边权未知的边”. 将所有边都设为 L+1,如果dis(S,T) < L ,那么必然无解. 将所有边都设为 1 ,如果 dis(S,T) > L ,那么必然无解. 考虑将任意一条边的权值+1,则 dis(S,T) 会 +0 或者 +1 . 如果将所有边按照某一个顺序不断+1,直到所有边的权值都是L+1了,那么在这个过程中,dis(S,T) 是递增的,而且一定…
题意 题目链接 题意:给出一张无向图,每次询问两点之间的最短路,满足$m - n <= 20$ $n, m, q \leqslant 10^5$ Sol 非常好的一道题. 首先建出一个dfs树. 因为边数-点数非常少,所以我们可以对于某些非树边特殊考虑. 具体做法是:对于非树边连接的两个点,暴力求出它们到所有点的最短路 对于询问的$(x, y)$ 用树上的边,以及非树边连接的点到他们的最短路之和更新答案 由于边数的限制,非树边连接的点不会超过$2*(m - (n - 1)) = 42$个 #in…
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cma…
F - The Shortest Statement emmm, 比赛的时候没有想到如何利用非树边. 其实感觉很简单.. 对于一个询问答案分为两部分求: 第一部分:只经过树边,用倍增就能求出来啦. 第二部分:经过至少一条非树边, 如果经过一个树边那么必定经过其两个端点,暴力的求出这些端点为起始点的最短路. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make…
题目链接:The Shortest Statement 今天又在群里看到一个同学问$n$个$n$条边,怎么查询两点直接最短路.看来这种题还挺常见的. 为什么最终答案要从42个点的最短路(到$x,y$)之和,还有$x,y$到$LCA(x,y)$的距离里面取呢? 就是如果走非树边,那么一定要走42个点中的一个,不走树边,就是LCA求了. 我写的太蠢了,还写生成树,看大家都是LCA中的dfs直接标记下就行了. 验证了算法的正确,我又试了试把每条非树边只加一个点,也是AC的,其实想了想,确实正确. #i…
F. The Shortest Statement http://codeforces.com/contest/1051/problem/F 题意: n个点,m条边的无向图,每次询问两点之间的最短路.(m-n<=20) 分析: dijkstra. 如果是一棵树,那么可以直接通过,dis[u]+dis[v]-dis[lca]*2来求.现在如果建出一棵树,那么非树边只有小于等于21条. 只经过树边的路径用上面的方式求出,考虑经过非树边的路径. 经过非树边(至少一条),那么一定经过了这条边的顶点,所以…
F. The Shortest Statement time limit per test:4 seconds memory limit per test:256 megabytes input:standard input output:standard output You are given a weighed undirected connected graph, consisting of \(n\) vertices and \(m\) edges. You should answe…
codeforces 689 Mike and Shortcuts(最短路) 原题 任意两点的距离是序号差,那么相邻点之间建边即可,同时加上题目提供的边 跑一遍dijkstra可得1点到每个点的最短路,时间复杂度是O(mlogm) #include <cstdio> #include <iostream> #include <cstring> #include <queue> #include <vector> using namespace s…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间,要求输出起点到终点的最短时间. /* 最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 35043 Accepted Submission…
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是非常好理解的.理解透自己多默写几次就可以记住,机试时基本的工作往往就是高速构造邻接矩阵了. 对于平时的练习,一个非常厉害的 ACMer  @BenLin_BLY 说:"刷水题能够加快我们编程的速度,做经典则能够让我们触类旁通,初期假设遇见非常多编不出.最好还是就写伪代码,理思路.在纸上进行总体分析和…
原题传送门:CF1051F The Shortest Statement 题目大意,给你一个稀疏图,q次查询,查询两点之间距离 边数减点小于等于20 这不是弱智题吗,23forever dalao又开始虐题 作为蒟蒻的我只能在一旁出售烤绿鸟和main包,和大家一起吃西瓜 仔细想想,这题的确是很弱智 先随便找一个生成树,这样就能跑lca了 剩下的几条边的端点跑一下SPFA堆优化dij,用于特判,SPFA已经死了 查询先用lca算一下距离,再暴力枚举这40个端点到两点的距离值和(最多) 就这样完了,…
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+MLE, 算优点??:但好写好想,比下面的代码短了差不多一半. #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() { ][],point,i,j,…
HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++.h> #define nmax 110 #define inf 1e8 using namespace std; int mp[nmax][nmax]; int shortpath[nmax]; bool visit[nmax]; int n,m; void dij(int s) { int cur…
layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" catalog: true mathjax: true tags: - Dijkstra - 最短路树 - 图论 - 训练指南 Warfare And Logistics UVALive - 4080 题意 ①先求任意两点间的最短路径累加和,其中不连通的边权为L ②删除任意一条边,求全局最短路径和的最大值 题解…
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - Dijkstra - 图论 - 训练指南 Walk Through the Forest UVA - 10917 题意 Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比…
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - Dijkstra - 图论 - 训练指南 Airport Express UVA - 11374 题意 机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有…
最短路Dijkstra算法的一些扩展问题     很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的事啊,前天一次pku的比赛就得到了应验,因此下决心把这一类的问题要好好想一想. 搞了一天,总算有点成果,在此就总结一下这几类问题: 两点间的最短路的条数: 多关键字的极短路问题: 给定长度的路的条数: K短路及其条数: 标号法的一些看法: 程序设计与实现. 在此,先说明几个符号:label 是每次出…
华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达到指定速度,以便占据有利的战斗位置. 现假定只允许华夏60 执行以下三种基本飞行动作,并且只能在完成了一个基本动作的情况下再去执行另一个基本飞行动作.这样华夏60 的飞行可以表示成由这三种基本飞行动作组成的动作序列. (1)      维持原速做恒速爬升飞行,直至飞行高度提高 ∆h 英尺: (2) …
Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n(2<=n<=1000)个地标,唯一编号为1..n.地标1是谷仓:贝西整天站在其中的苹果树林是地标n.奶牛在田里行走时使用地标间不同长度的T(1<=t<=2000)双向牛道.贝西对自己的导航能力没有信心,所以一旦开始,她总是沿着一条从开始到结束的路线行进. 根…
https://codeforces.com/contest/1051/problem/F 题意 给一个带权联通无向图,n个点,m条边,q个询问,询问两点之间的最短路 其中 m-n<=20,1<=n,m<=1e5 思路 因为图一定联通,所以n-1<=m<=n+20 因为是求任意两点的最短路,所以直接暴力跑最短路是不行的,考虑选择性的跑最短路 因为是求两点之间的距离,所以可以往lca方面想 先跑一棵生成树出来,然后处理出每个点的lca,这样就可以求出任意两点的距离 然后就可以记…
题目描述 You are given a weighed undirected connected graph, consisting of n vertices and mm edges. You should answer q queries, the i-th query is to find the shortest distance between vertices ui and vi. Input The first line contains two integers n and…
题目链接 传送门 题面 题意 给你一张有\(n\)个点\(m\)条边的联通图(其中\(m\leq n+20)\),\(q\)次查询,每次询问\(u\)与\(v\)之间的最短路. 思路 由于边数最多只比点数大21,因此我们可以先跑出一棵最小生成树,然后将非树上边的两个端点跑一边最短路,然后每次查询就比较\(max((dis[u]+dis[v]-2dis[lca(u,v)]),dist[i][u]+dis[i][v])\),其中\(dis[u]\)表示\(u\)到最小生成树根节点的距离,\(dist…
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\): t==2,由\(u\)向\([l,r]\)中任意一些点连边,每次花费\(w\): t==3,由\([l,r]\)中任意一些点向u连边,每次花费\(w\). 最后求使给定的\(s\)到达点\(i(1\leq i\leq n)\)的最小花费. \(Solution\) 花费看成每条边的边权,全都连…