随笔分类 - 图论——最短路
摘要:题意: 给一个如图形式的$n m$的方格,从左上走到右下,给出边权,问分成两块所需的最小代价。$n,m\leq1000$。 思路: 显然是个最小割,但是$O(n^2m)$的复杂度很高,虽然这道题能过。 这里介绍一种最大流改最短路的方法——对偶图。 对任意一个图我们可以变成对偶图: 如下图,每一个闭合
阅读全文
摘要:```cpp struct Edge{ int to, next; int w; }edge[MAXM]; struct qnode{ int u; int c; qnode(int _u = 0, int _c = 0):u(_u), c(_c){} bool operator que; while(!que.empty()) que.p...
阅读全文
摘要:题意:n个点,m条有向边,指定k个点,问你其中最近的两点距离为多少 思路:这题的思路很巧妙,如果我们直接枚举两点做最短路那就要做C(k,2)次。但是我们换个思路,我们把k个点按照二进制每一位的0和1分类logn次,然后做集合最短距离。因为任意两个不等的数,总有一位不一样,所以每个点都有机会和其他点在
阅读全文
摘要:题目链接:https://www.nowcoder.com/acm/contest/203/I?tdsourcetag=s_pcqq_aiomsg来源:牛客网 思路:我们用用fa[i]表示距离i最近的大都市,dis[i]表示i距离该大都市的距离。我们先把所有大都市加入初始点,然后跑Dijkstra,
阅读全文
摘要:思路:K短路裸题 代码:
阅读全文
摘要:题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做。A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h代表从当前点走到终点的最短路,显然h可以用最短路解出。那么我们从起点开始找,每次找f最小的点,直到找
阅读全文
摘要:Description During the trip, Yehan and Linlin pass a cave, and there is a board at the door, which says if you have enough ambition, you will get lots
阅读全文
摘要:题意:好长...从(0,0)走到(w-1,h-1),墓碑不能走,走到传送门只能进去不能走到其他地方,经过传送门时间会变化w(可能为负),其他地方都能上下左右走。如果能无限返老还童输出Never,走不到终点输出Impossible,其他输出最短时间。 思路:没想到是最短路,刚看懂题目还以为是暴搜+剪枝
阅读全文
摘要:题意:给出m个关系,问你能确定机头牛的排名 思路:要确定排名那必须要把他和其他n-1头牛比过才行,所以Floyd传递闭包,如果赢的+输的有n-1就能确定排名。 代码:
阅读全文
摘要:题意:给a b c要求,b拿的比a拿的多但是不超过c,问你所有人最多差多少 思路:在最短路专题应该能看出来是差分约束,条件是b - a <= c,也就是满足b <= a + c,和spfa的松弛条件相对应,所以我们建一条a到b的边,权值c,然后跑最短路,求出所有差值最大的那个即为答案。应该算是基础的
阅读全文
摘要:题意:给你n个点,m条无向边,每个点都属于一个层,相邻层的任意点都能花费C到另一层任意点,问你1到n最小路径 思路:没理解题意,以为每一层一个点,题目给的是第i个点的层数编号。这道题的难点在于建边,如果用最朴素的相邻层所有点互相连接,那么可能有5*10^4连5*10^4,复杂度O(n^2)。这里我们
阅读全文
摘要:题意:从A走到B,有最短路,问这样不重复的最短路有几条 思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[u][v] == dis1[end],那么uv这条边是最短路的一条边。然后我们选完边,把边加入ISA
阅读全文
摘要:思路:虽然是最短路专题里的,但也很难想到是最短路,如果能通过这些关系想到图论可能会有些思路。我们把X数组看做邻接矩阵,那么三个条件就转化为了:1、1的出度为1;2、n的入度为1;3、2~n-1的出度等于入度。C*X则是路径花费,最后求满足这些条件的路径的最少花费。满足这些条件的情况有两种:一是1到n
阅读全文
摘要:题意:有一串数字1~n,按顺序排序,给两种要求,一是给定u,v保证pos[v] - pos[u] <= w;二是给定u,v保证pos[v] - pos[u] >= w。求pos[n] - pos[1]最大,若无解输出-1,无穷多解输出-2。 思路:光看题目好像和最短路无关,其实这里用到了spfa的松
阅读全文
摘要:思路:最短路求出到每个点的最小代价,然后01背包,求出某一代价所能拿到的最大价值,然后搜索最后结果。 代码:
阅读全文
摘要:题意:小A要乘车到s车站,他有w个起始车站可选,问最短时间。 思路:用Floyd超时,Dijkstra遍历,但是也超时。仔细看看你会发现这道题目好像是多源点单终点问题,终点已经确定,那么我们可以直接转置邻接矩阵,从终点找最小的起点,转换成了单源最短路问题。 代码:
阅读全文
摘要:题意:中文题意不解释... 思路:交换物品使得费用最小,很明显的最短路,边的权值就是优惠的价格,可以直接用Dijkstra解决。但是题目中要求最短路路径中任意两个等级不能超过m,我们不能在连最短路的时候直接判断,但是我们可以通过预处理+遍历解决。因为一条路径肯定有一个最小level的人,我们假设他为
阅读全文
摘要:题意:中文题意不解释... 思路:这道题居然可以转化为最短路orz,要等式有非负整数解,我们可以转化一下:每个ai不限数量,问你能用ai数组拼出多少个Bmin~Bmax范围内的数,有点像完全背包的感觉,看怎样组合能拼出范围内的数。 我们找出ai中不为零的最小数记为p,如果我们把每个数进行操作ai%p
阅读全文
摘要:题意:中文题意不解释... 思路:分层图最短路,我们再开一维用来表示当前用了多少次免费次数,dis[i][j]就表示到达i点用了j次免费的最短路,有点DP的感觉。 当个模板用 参考:分层图最短路 代码:
阅读全文
摘要:题意:给你m条路花费时间(双向正权路径),w个虫洞返回时间(单向负权路径),问你他能不能走一圈回到原点之后,时间倒流。 思路:题意有点难看懂,我们建完边之后找一下是否存在负权回路,存在则能,反之不能。判断负权回路可以用一个cnt,这个spfa板子里有。 代码:
阅读全文