图论
文章平均质量分 62
Brightess
毕业于湖南城市学院
目前在某游戏大厂搬砖(
展开
-
VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)
并查集 dfs原创 2023-05-04 18:07:53 · 941 阅读 · 0 评论 -
SPOJ - COT Count on a tree(树上主席树 求树中路径第 k 小权值 + 倍增 LCA)
树上主席树 求树中路径第 k 小权值 + 倍增 LCA原创 2022-09-01 22:51:44 · 370 阅读 · 0 评论 -
牛客2022 暑期多校6 B Eezie and Pie(树上差分 + 倍增求第 kth 祖先板子)
树上差分 + 倍增求第 kth 祖先原创 2022-08-07 21:26:56 · 299 阅读 · 0 评论 -
洛谷 P5536 【XR-3】核心城市(贪心 + 树形 dp 寻找树的中心)
X 国有 nnn 座城市,n−1n - 1n−1 条长度为 111 的道路,每条道路连接两座城市,且任意两座城市都能通过若干条道路相互到达,显然,城市和道路形成了一棵树。X 国国王决定将 kkk 座城市钦定为 X 国的核心城市,这 kkk 座城市需满足以下两个条件:第一行 222 个正整数 n,kn,kn,k。接下来 n−1n - 1n−1 行,每行 222 个正整数 u,vu,vu,v,表示第 uuu 座城市与第 vvv 座城市之间有一条长度为 111 的道路。数据范围:一行一个整数,表示答案。样例输出原创 2022-07-01 21:29:43 · 403 阅读 · 0 评论 -
洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)
欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有 nnn 个等待点,有 n−1n-1n−1 条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币。参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有足够多的游戏币(用于支付使用道路的花费)、地图(标明等待点之间道路连接的情况)以及对话机(用于和同组的成员联系)。当集合号吹响后,每组成员之间迅速联系,了解到自己组所有成员所原创 2022-06-30 19:57:25 · 403 阅读 · 0 评论 -
洛谷 P3398 仓鼠找 sugar(树上倍增 lca 判断树中两条路径是否相交 结论)
小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧!第一行两个正整数n和q,表示这棵树节点的个数和询问的个数。接下来n-1行,每行两个正整数u和v,表示节点u到节点v之间有一条边。接下来q行,每行四个正整数a、b、c和d,原创 2022-06-30 15:42:30 · 340 阅读 · 0 评论 -
2022牛客寒假2 小沙的长路(数学规律题 欧拉回路 一笔画问题)
题意:在一张 包含 n 个点 的 完全图 中,自定义其中任意数量的边的方向,所有边的权重都是 1,要求算出 经过 n 个点,且 每条边只能经过 1 次 的 最短路径 min 和 最长路径 max。思路:观察数据范围,我们发现只能运用 O(logn) 或者 O(1) 的算法,然而前者不方便实现,因此我们考虑用 O(1) 的算法,显然需要找规律。当 n = 1 时,图上只有 1 个点,显然有 min = max = 0;当 n = 2时,图上只有 2 个点,则 min = max = 1;当 n..原创 2022-05-03 23:57:13 · 394 阅读 · 2 评论 -
AcWing 1137. Choose the best route(朴素dijkstra反向建图 or 虚拟源点法)
法一、二都是用的朴素dijkstra算法法一:反向建图 求终点n到每个起点的最短距离 O(T * (n^2 + n))#include <bits/stdc++.h>using namespace std;const int N = 1010, M = 2e4+10;#define inf 0x3f3f3f3fint g[N][N], dist[N];bool st[N];int n, m, s;int w;int W[N];int dijk(int s){ ...原创 2022-02-24 21:57:44 · 383 阅读 · 0 评论 -
AcWing 342. 道路与航线(spfa SLF优化)
普通spfa最坏情况O(nm),会被本题卡。我找到一个spfa优化的做法。SLF(Small Label First) 双端队列优化,也被戏称为“酸辣粉优化”优化思路:将原队列改成双端队列,对要加入队列的点 p,如果 dist[p] 小于队头元素 u 的 dist[u],将其插入到队头,否则插入到队尾。不推荐,因为y总说这是对数据做优化,但竞赛的时候是不知道数据的,想卡还是会被卡。因此正解是做法二下面是做法一(spfa SLF优化 可以AC本题)#include<bits/stdc++...原创 2022-02-24 18:34:46 · 185 阅读 · 0 评论 -
AcWing 341. 最优贸易(spfa + dp)
前置理论:在题解这道题之前先讲一下 dp和最短路的关系。其实最短路和dp的交集是很大的。dp问题运用集合分析完之后,把所有的方案归为若干类之后,每一类都用dp[i, j]状态表示(我们以二维为例子),我们将每一个状态看做图当中的一个点,如果dp[i, j]可以由某个状态更新的话,如背包问题中的:dp[i, j] = max(dp[i-1, j], dp[i-1, j-vi] + wi),dp[i, j]这个状态点可以由dp[i-1, j]和dp[i-1, j-vi]两个状态点转移而来,且边权重一条是原创 2022-02-24 18:19:40 · 203 阅读 · 0 评论 -
AcWing 340. 通信线路(第k+1大值最小 二分答案 + 堆优化dijkstra)
题意:求一张无向图上 所有从 1→n 的路径中,第 k+1 大的边权的最小值。题意:首先考虑暴力怎么做:搜出所有路径再找最小值,但我们发现数据规模太大,做不了。于是我们可以从最小值入手,也就是采取二分答案,利用二分将这个值求出来。题目中给出边权的最大值是1e6,我们将二分的区间范围定为[0, 1e6+1]假设我们二分出一个值x,那意味着x应该满足:从 1→n 的路径中应该存在一条路,使得这条路上 最多有 k 条大于x的边。(二分值需要满足的属性)那么如何刻画这个属性呢?可以着眼于图上的边权是原创 2022-02-23 22:01:49 · 611 阅读 · 0 评论 -
堆优化Dijkstra算法求最短路 并输出最短的路径
#include<bits/stdc++.h>using namespace std;const int N = 1010, M = 2e4+10;typedef pair<int, int> pii;#define x first#define y second#define inf 0x3f3f3f3fint dist[N], h[N], e[M], ne[M], w[M], idx;bool st[N];int n, p, k;int Prev[N];原创 2022-02-23 19:46:05 · 510 阅读 · 0 评论 -
luogu P3371 【模板】单源最短路径(弱化版)
注意:① 权值数组W容量和边的最大值一致② dist数组初始化最好用for循环(循环次数用输入的n,i从1开始)③ 2^31-1即int的最大值,输出可以直接用:numeric_limits ::max()④ 看清节点和边的数据范围#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;#define inf 0x3f原创 2021-09-26 16:31:30 · 79 阅读 · 0 评论 -
luogu p2661 信息传递(路径压缩并查集求最小环)
题目描述有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti的同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自 己的生日时,游戏结束。请问该游戏一共可以进行几轮?输入格式共2行。第1行包含1个正整数 n ,表示原创 2021-09-28 19:16:13 · 203 阅读 · 0 评论 -
acwing165.小猫爬山(dfs剪枝 优化搜索顺序)
翰翰和达达饲养了 N 只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。翰翰和达达只好花钱让它们坐索道下山。索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过 W。每租用一辆缆车,翰翰和达达就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?输入格式第 1 行:包含两个用空格隔开的整数,N 和 W。第 2…N+1原创 2021-09-30 15:12:35 · 323 阅读 · 0 评论 -
luogu p3905 道路重建(最短路)
题目描述从前,在一个王国中,在n个城市间有m条道路连接,而且任意两个城市之间至多有一条道路直接相连。在经过一次严重的战争之后,有d条道路被破坏了。国王想要修复国家的道路系统,现在有两个重要城市A和B之间的交通中断,国王希望尽快的恢复两个城市之间的连接。你的任务就是修复一些道路使A与B之间的连接恢复,并要求修复的道路长度最小。输入输出格式输入格式:输入文件road.in,第一行为一个整数n(2<n≤100),表示城市的个数。这些城市编号从1到n。第二行为一个整数m(n-1≤m≤n(n-1)/2)原创 2021-10-05 11:28:42 · 207 阅读 · 0 评论 -
hdu 1151 Air Raid(DAG有向无环图 最小路径覆盖+二分图最大匹配Hungarian)
Problem DescriptionConsider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an intersection and walking through town’s streets you can never reach the same intersection i原创 2021-10-11 21:51:16 · 409 阅读 · 0 评论 -
[USACO3.2] Sweet Butter(java API + spfa)
Sweet ButterGreg Galperin – 2001Farmer John has discovered the secret to making the sweetest butter in all of Wisconsin: sugar. By placing a sugar cube out in the pastures, he knows the N (1 <= N <= 500) cows will lick it and thus will produce supe原创 2021-10-22 16:27:50 · 741 阅读 · 0 评论 -
朴素dijkstra算法 :AcWing 849. Dijkstra求最短路 I
Dijkstra算法(适用于稠密图)Dijkstra算法的流程如下:dijkstra算法片段:int dijkstra()//求出了每个点到起点的最短距离{ memset(dist,0x3f,sizeof dist);//除1号节点之外,其余均初始化为无穷大 dist[1]=0; for(int i=0;i<n;i++)//i下标从0开始意在提醒这仅表示n次迭代,每一次寻找不在s中距离最近的点t { int t=-1;//便于更新第一个点原创 2022-02-20 17:08:47 · 665 阅读 · 0 评论 -
堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II
堆优化版dijkstra算法分析:朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程。可以用小根堆(C++STL priority_queue)对dist数组进行维护,用O(logn)的时间获取最小值并从堆中删除,用O(logn)的时间执行一条边的扩展和更新。因此最终我们可在 **O(m logn)**的时间”内实现 Dijkstra算法。该算法适用于稀疏图,非负权边图。代码片段:int dijk(){ memset(dist, 0x3f原创 2022-02-20 17:55:59 · 601 阅读 · 0 评论 -
Bellman-Ford算法:AcWing 853. 有边数限制的最短路
Bellman-Ford算法分析:给定一张有向图,若对于图中的某一条边 (x, y,z),有 dist[y] ≤dist[x]+z成立,则称该边满足三角形不等式。若所有边都满足三角形不等式,则dist数组就是所求最短路。我们先介绍基于迭代思想的Bellman-Ford 算法。它的流程如下:1.扫描所有边(x, y,z),若dist[y] > dist[x]+z,则用dist[x]+z更新dist[y]。2.重复上述步骤,直到没有更新操作发生。Bellman-Ford算法的时间复杂度为O(原创 2022-02-20 18:40:17 · 390 阅读 · 0 评论 -
SPFA算法:AcWing 851. spfa求最短路
SPFA算法分析:SPFA算法实际上是“队列优化的Bellman-Ford 算法”。SPFA 算法的流程如下:1.建立一个队列,最初队列中只含有起点1。2.取出队头节点x,扫描它的所有出边(x,y,z),若dist[y] > dist[x]+z,则使用dist[x]+z更新 dist[y]。同时,若y不在队列中,则把y入队。3.重复上述步骤,直到队列为空。在任意时刻,该算法的队列都保存了待扩展的节点。每次入队相当于完成一次 dist数组的更新操作,使其满足三角形不等式。一个节点可能会原创 2022-02-20 20:34:11 · 713 阅读 · 0 评论 -
AcWing 852. spfa判断负环(抽屉原理)
思路:运用 SPFA算法 结合 抽屉原理 判断图中是否存在负环时间复杂度:O(nm) n 表示点数,m 表示边数代码:#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N = 2000+10;const int M = 10000+10;#define inf 0x3f3f3f3fi..原创 2022-02-20 20:58:11 · 517 阅读 · 0 评论 -
Floyd算法:AcWing 854. Floyd求最短路
Floyd算法分析:为了求出图中任意两点间的最短路径,当然可以把每个点作为起点,求解N次单源最短路径问题。不过,在任意两点间最短路问题中,图一般比较稠密。使用 Floyd算法 可以在 O(N^3) 的时间内完成求解,并且程序实现非常简单。设d[k,i,j]表示“经过若干个编号不超过k的节点”从i到 j的最短路长度。该问题可划分为两个子问题:经过编号不超过k-1的节点从i 到 j,或者从i先到k再到j。于是:d[k,i,j]= min(d[k-1,i,j],d[k-1,i,k]+d[k-1,k,j原创 2022-02-20 21:17:10 · 447 阅读 · 0 评论 -
AcWing 1129. 热浪(朴素dijk、堆优化dijk、bellman_ford、spfa求无向图最短路)
题意:给你点数、边数、起点、终点,哪些边,让你求起点到终点最短路径。是一道很适合拿来练手的纯裸模板题。思路:本题数据范围:1≤T≤2500,1≤C≤6200,朴素dijk、堆优化dijk、bellman_ford、spfa算法都可以过,选一个自己喜欢的即可,注意 该图是无向图。下面用四个方法解决这道题。朴素版dijkstra做法 O(n^2)#include<bits/stdc++.h>using namespace std;int T, C;#define inf 0...原创 2022-02-21 19:28:05 · 399 阅读 · 0 评论 -
AcWing 1128. 信使(floyd 广播模型)
题意:如题。思路:本题实际上是一个广播模型,初始时指挥部将一条广播发出去,它会向所有与它连有边的节点传输广播,每个节点接收到信息以后又会向与各自连有边的节点发出广播,同时每个节点都是会反向广播的(无向边)。题目问的是:整个网络的所有节点都接到信息一共需要多少时间?我们先考虑一下对于每个节点接收到指挥部的信息需要多少时间:从指挥部到当前点的每一条路径都会成为一个广播的途径,那么当前点第一次接收到广播的时间显然就是所有路径中最短的那个(即指挥部到当前点的最短距离)。因此本题核心在于:对于每个点...原创 2022-02-21 20:55:12 · 618 阅读 · 0 评论 -
AcWing 1127. 香甜的黄油(循环跑堆优化dijkstra)
题意:p个顶点c条正权边,每个点有若干个奶牛在1-p号点里面找一个点,使得所有点里面的奶牛到这个点的距离和最小思路:一道最短路的升级应用,根据题意, 我们需要找到一个距离所有牛最短的牧场。那么只需要枚举所有牧场为起点,求此时所有其他牧场到它的最短路之和即可。然后输出所有牧场中最短距离即为答案。先看数据:点数800,边数1450*2(无向图),每个点跑一次。多源最短路,先想Floyd、bellman_ford 和 朴素版dijkstra ,算一算会超时。然后就是堆优化版dijkstra和s...原创 2022-02-21 23:34:16 · 565 阅读 · 0 评论 -
AcWing 1126. 最小花费(朴素dijkstra变式)
题目描述在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。输入格式第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100)。最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。输出格式输出A使得B到账100元最少需原创 2022-02-22 09:44:21 · 216 阅读 · 0 评论 -
AcWing 920. 最优乘车(建图,特殊处理输入,bfs求最短路)
题意:给定路线数m,站点数n,m条单程路线会经过哪些站点,问从起点1到终点n****最少要换乘几次。思路:换乘多少次 可以转换为 乘坐过多少次车减1步骤:1、在同一条路线中,任意一个 在此路线上的车站 均能 沿着该路线的方向 到达后面的车站,权值都是1,表示 只乘坐一次车。解释:以样例 4 7 3 6 为例,分别将 4 ~ 7、4 ~ 3、4 ~ 6、7 ~ 3、7 ~ 6、3 ~ 6 连一条边,权值为 1:表示从 车站4做到 车站7 只要乘一次车,表示从 车站4 做到 车站3 只..原创 2022-02-22 20:29:15 · 368 阅读 · 0 评论 -
AcWing 1135. 新年好(堆优化dijkstra打表 + dfs)
题意:规定起点为1号点,主角要求从起点出发,必须要经过其它5个点(这5个点的编号任意),且这 5个点的 经过顺序不唯一,问 主角总行程的最小值 是多少?图中的节点当然不仅仅只是上面所说的6个点,注意上的所有节点都是联通的,而且节点之间的边是无向边。思路:拿到一个题目并思考运用什么算法的时候,我们首先最要关心的是时间复杂度。我们先想想暴力怎么做,我们可以先爆搜枚举所有摆放的顺序,一共有5个需要经过的节点,因此就会有5!种拜访的顺序。(由于起点1号点是固定的,我们dfs爆搜顺序实际上是搜索2~...原创 2022-02-23 12:12:44 · 432 阅读 · 0 评论