题意 题目链接 题意:给出一张无向图,每次询问两点之间的最短路,满足$m - n <= 20$ $n, m, q \leqslant 10^5$ Sol 非常好的一道题. 首先建出一个dfs树. 因为边数-点数非常少,所以我们可以对于某些非树边特殊考虑. 具体做法是:对于非树边连接的两个点,暴力求出它们到所有点的最短路 对于询问的$(x, y)$ 用树上的边,以及非树边连接的点到他们的最短路之和更新答案 由于边数的限制,非树边连接的点不会超过$2*(m - (n - 1)) = 42$个 #in…
原题传送门:CF1051F The Shortest Statement 题目大意,给你一个稀疏图,q次查询,查询两点之间距离 边数减点小于等于20 这不是弱智题吗,23forever dalao又开始虐题 作为蒟蒻的我只能在一旁出售烤绿鸟和main包,和大家一起吃西瓜 仔细想想,这题的确是很弱智 先随便找一个生成树,这样就能跑lca了 剩下的几条边的端点跑一下SPFA堆优化dij,用于特判,SPFA已经死了 查询先用lca算一下距离,再暴力枚举这40个端点到两点的距离值和(最多) 就这样完了,…
You are given a weighed undirected connected graph, consisting of nn vertices and mm edges. You should answer qq queries, the ii-th query is to find the shortest distance between vertices uiui and vivi. Input The first line contains two integers n an…
题目:给定一张n个点m条有权边的无向联通图,q次询问两点间的最短路 n≤100000,m≤100000,m-n≤20. 首先看到m-n≤20这条限制,我们可以想到是围绕这个20来做这道题. 即如果我们随便在图上找一棵树,有最多21条非树边,连接最多42个顶点 考虑两点x,yx,y之间的最短路就是某个点到xx和yy的最短路之和 首先对于只走树边的情况,这个点是两点的LCA 如果经过非树边,xx或yy到枚举的这个点的最短路上的最后一条边一定是非树边(如果都是树边的话完全可以转化到一个连接着非树边的点…
题目链接: 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$的最短距离时我们先只考虑树上的点,显…
题目大意:给定一张$n$个点$m$条有权边的无向联通图,$q$次询问两点间的最短路 $n\le100000$,$m\le100000$,$1\le100000$,$m$-$n\le20$. 首先看到$m$-$n\le20$这条限制,我们可以想到是围绕这个20来做这道题. 即如果我们随便在图上找一棵树,有最多21条非树边,连接最多42个顶点 考虑两点$x,y$之间的最短路就是某个点到$x$和$y$的最短路之和 首先对于只走树边的情况,这个点是两点的$LCA$ 如果经过非树边,$x$或$y$到枚举的…
题目 You are given a weighed undirected connected graph, consisting of n vertices and m edges. You should answer q queries, the i-th query is to find the shortest distance between vertices \(u_i\) and \(v_i\). 输入格式 The first line contains two integers…
题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚举每条非树边的两个端点,求一遍这两个点到所有点的最短路.非树边最多21条,所以要求一遍最短路的点最多42个. 另外对于一条边的两个点只求一个就好了.因为要用这条非树边的话它们两个都要经过. //779ms 28900KB #include <queue> #include <cstdio&g…
动态询问连通图任意两点间最短路,单次询问. 显然,肯定有一些巧妙地性质(不然你就发明了新的最短路算法了233)有一点很奇怪:边数最多只比点数多 $20$ 个,那么就可以将这个图看作是一个生成树,上面连了不到 $20$ 条边. 考虑两个点之间地最短路只有两种情况:经过所有只在生成树上的点,或者经过一些连着生成树外的点. 第一个情况非常好求,随便搞一个生成树然后求个距离就行. 对于第二种情况,由于连着生成树外的边的点最多只有 $20$ 个,所以可以对这些点都跑一遍最短路,然后依次枚举即可. 每次询问…
F - The Shortest Statement emmm, 比赛的时候没有想到如何利用非树边. 其实感觉很简单.. 对于一个询问答案分为两部分求: 第一部分:只经过树边,用倍增就能求出来啦. 第二部分:经过至少一条非树边, 如果经过一个树边那么必定经过其两个端点,暴力的求出这些端点为起始点的最短路. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make…