图论
文章平均质量分 65
__Rain
这个作者很懒,什么都没留下…
展开
-
L3-028 森森旅游(单源最短路 + multiset 维护多重集最小值
L3-028 森森旅游 (30 分)思路:首先不考虑查询和修改操作,只考虑原始图中的答案把路径分为前半段现金支付和后半段旅游金支付,可以发现去枚举一个决策点,维护 min(cost1+cost2)min(cost_1+cost_2)min(cost1+cost2) 即可前半段花费显然是单源最短路,后半段建反图也同样是单源最短路由于后半段是旅游金,需要转化为现金,答案即为 min(cost1+(cost2+ai−1)ai)min(cost_1+ \frac{(cost_2+a_i-1)}{a_i原创 2022-04-11 18:49:26 · 590 阅读 · 0 评论 -
F. K-th Path (求第k小最短路 floyd算法
F. K-th Path题意:从当前所有边中找出第 kkk 小的边的权值思路:题解code:原创 2022-03-13 16:53:32 · 342 阅读 · 0 评论 -
ABC 243 E(floyd + 删边
E - Edge Deletion题意:给定一个无向图,无自环,nnn 个 mmm 条边。删除边需要保证图仍然连通并且任意两点的最短路不变,问最多能删多少条边思路:floydfloydfloyd 判一下,如果两点 u,vu,vu,v之间可通过一点 kkk 松驰,那就记录 u,vu,vu,v 有中间点 kkk ,那么边 u,vu,vu,v 就不可取。code:#include<bits/stdc++.h>#define endl '\n'#define ll long long原创 2022-03-12 21:51:36 · 482 阅读 · 0 评论 -
P6154 游走 (期望 拓扑排序 dp计数
P6154 游走题意:给定一个有向无环图,在图上游走,每次选定一条路径,起点和终点可以相同选择每条路径的概率相同,求一条路径的期望长度思路:期望 E(X)=∑Xi×P(Xi)E(X)=\sum X_i\times P(X_i)E(X)=∑Xi×P(Xi)每条路径出现的概率相同,设总路径和为 lengthlengthlength,总路径数为 numnumnum那么期望就是 lengthnum\frac{length}{num}numlength设 sum[x],cnt[x]sum[x],原创 2022-03-09 20:46:03 · 258 阅读 · 0 评论 -
P6560 [SBCOI2020] 时光的流逝 (博弈,反向建图,拓扑排序
洛谷P6560 [SBCOI2020] 时光的流逝题意:给定一个有向图(可能有环),给定起点和终点,两个人玩游戏,一人走一步,先到达终点的人赢或者先无法移动的人输思路:题解因为是终点和叶子节点是必败态,这是确定的,因此我们可以倒着搞建反图跑拓扑排序更新节点胜负态存在环就很难搞,拓扑排序的时候是无法进入环的,那么环上的点就难以确定胜负态更新思想有点类似于点权这个题就是如果当前节点胜负态是确定的,就可以去更新其他节点,我们就把他 pushpushpush 到队列中,而不是按照拓扑排序的顺序来原创 2022-03-09 19:00:54 · 4665 阅读 · 0 评论 -
floyd与传递闭包
在交际网络中,给定若干个元素和若干对二元关系,且关系具有传递性。通过传递性推导出尽量多的元素之间的关系的问题被成为传递闭包建立邻接矩阵 ddd,di,j=1d_{i,j}=1di,j=1 表示 iii 与 jjj 有关系,di,j=0d_{i,j}=0di,j=0 表示 iii 与 jjj 没有关系。特别的,di,id_{i,i}di,i 始终为 111。使用 floydfloydfloyd 算法可以解决传递闭包问题:ll n, m;bool d[maxn][maxn];void work()原创 2022-03-09 09:32:12 · 816 阅读 · 0 评论 -
道路与航线 (无向图缩点 拓扑排序求最短路
342. 道路与航线思路:看起来像是道最短路模板题,但是 spfaspfaspfa 会 TTT 掉,优化的 spfaspfaspfa 好像可以过掉这个题不过我们这里不讨论优化的 spfaspfaspfa题目限制比较奇妙,双向边的权值是非负的,单向边的权值可能为负,但是单向边不会构成环code:...原创 2022-03-08 20:31:27 · 260 阅读 · 0 评论 -
处女座的比赛资格 (DAG 拓扑排序求最短路
处女座的比赛资格思路:由负权跑不能用迪杰斯特拉跑 spfaspfaspfa 会被卡由于这是一张有向无环图,因此可以拓扑排序求单源最短路code:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define ull unsigned long long#define ld long double#define all(x) x.begin(), x.end()#define mem(x, d) mem原创 2022-03-08 19:36:24 · 120 阅读 · 0 评论 -
B. Brexit Negotiations (贪心反向建图,拓扑排序
B. Brexit Negotiations题意:给定一个 DAGDAGDAG,找出一个拓扑序,最小化最大的 val[x]+idval[x]+idval[x]+id,ididid 表示它在拓扑序中的位置思路:一眼看最小化最大值,以外是二分,但是不会写,这看题解说贪心+反向建图跑拓扑排序贪心跑拓扑序很好理解我们肯定向让 val[x]val[x]val[x] 大的节点尽量靠前放,也就是用大 val[x]val[x]val[x] 和 小 ididid 结合如果我们正着建图41 0100 1原创 2022-03-08 13:15:48 · 472 阅读 · 0 评论 -
连通图专题
有向图连通性牛客专题链接Network of Schools题意:给你一张有向图,问最少需要几个起点,才能遍历完所有点以及要至少加几条边,才能从使得整个图强连通思路:先缩点求出所有的强连通分量,如果图本身强连通,那么选一个起点就好,并且不用加边否则就需要选定所有入度为 000 的强连通分量作为起点然后入度为 000 和出度为 000 的强连通分量两两连边,取 maxmaxmax 就好了code:#include<bits/stdc++.h>#define endl '\n'原创 2022-02-28 22:03:29 · 163 阅读 · 0 评论 -
C. Game Master(强连通分量,缩点,建图
C. Game Master题意:nnn 个选手在进行比赛,比赛有两个场地,每个选手都有两个值表示在这两个场地上的能力值n−1n-1n−1 场比赛,每次从剩余的选手中选出两个,并在两个场地中任选一个,强者获胜,最后剩下一个选手即为冠军问 nnn 个人是否能成为冠军,如果能输出 111,否则输出 000最后输出一个 010101 串思路:题解题解讲的非常棒看了题解感觉这个题目有点熟悉,然后发现和这个题差不多 P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G原来是原创 2022-02-27 17:08:50 · 641 阅读 · 0 评论 -
牛客练习赛93 C(树形dp? E(欧拉路径
点权思路:题解写法类似迪杰斯特拉算法首先叶子节点肯定是花费 000开一个优先队列,然后从叶子节点开始拓展,对于每个节点维护两个值,花费的最小值和次小值,如果一个节点的点权可以变成 222 或者 变成 222 的花费更小了,它就可以加入优先队列去更新其他节点code:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define ull unsigned long long#define ld long原创 2022-02-17 21:07:02 · 446 阅读 · 0 评论 -
欧拉回路/欧拉路径
搬来大佬的前置知识:定义:从一个点出发,不重不漏的经过图中每一条边的一条路径(允许多次经过同一个点)。如果此路径的起点和终点相同,则称其为一条欧拉回路。欧拉路径判定(是否存在):首先要保证连通有向图欧拉路径:图中恰好存在 111 个点出度比入度多 111(这个点即为起点 SSS),111 个点入度比出度多 111(这个点即为终点 TTT),其余节点出度 === 入度。有向图欧拉回路:所有点的入度 === 出度(起点 SSS 和终点 TTT 可以为任意点)。无向图欧拉路径:图中恰好存在 222原创 2022-02-26 11:25:30 · 952 阅读 · 0 评论 -
最长路模板题
P1807 最长路思路:拓扑排序求最长路因为起点固定为 111,所以需要 disdisdis 数组初始化负无穷,然后 dis[1]=0dis[1]=0dis[1]=0code:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define ull unsigned long long#define ld long double#define all(x) x.begin(), x.end()#defin原创 2022-02-25 18:31:12 · 183 阅读 · 0 评论 -
tarjan算法的应用
割点割边知乎大佬的详细讲解割点与桥两者割点:需要单独判断根是否为割点,有至少2个child即为割点low[to] >= dfn[now]割边low[to] > dfn[now] // 不用考虑根节点tarjan求割点P3388 【模板】割点(割顶)code:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define ull unsigned long long#defin原创 2022-02-12 12:13:22 · 407 阅读 · 0 评论 -
ABC 237 E(无向图中的最长路问题转化为最短路问题
题意:给定 nnn 点高度为 aia_iai,初始位置为 111,求从 111 出发的最长路(经过边权的代数和最大)是多少两个点之间的边权这样定义:现在从 xxx 要去 yyy如果 ax>aya_x>a_yax>ay,那么边权为 ax−aya_x-a_yax−ay如果 ax<aya_x<a_yax<ay,那么边权为 −2∗(ay−ax)-2*(a_y-a_x)−2∗(ay−ax)相等边权为 000思路:设终点的高度为 k<a1k &原创 2022-02-07 00:26:25 · 769 阅读 · 0 评论 -
最短路的最大权值
最短路中我们是这么更新的int to = e[i].to;if(dis[to] > dis[x] + e[i].w){ dis[to] = dis[x] + e[i].w; q.push({dis[to], to});}现在我们只需要改成即可int to = e[i].to;ll z = max(e[i].w, dis[x]if(dis[to] > z){ dis[to] = z; q.push({dis[to], to};}...原创 2022-01-31 00:12:02 · 450 阅读 · 0 评论 -
分层图最短路
P2939 USACO09FEBRevamping Trails G小雨坐地铁原创 2022-01-30 20:02:31 · 360 阅读 · 0 评论 -
CCPC 2019 哈尔滨 E(建图+拓扑dp计数+计算贡献 I(思维
E. Exchanging Gifts题意:给定 nnn 个序列,每行一个,有两种给出方式111 kkk a1,a2...aka_1,a_2...a_ka1,a2...ak, (ai<=n)(a_i<=n)(ai<=n) 表示第 iii 个序列有 kkk 个数222 xxx yyy (x,y<=i−1)(x,y<=i-1)(x,y<=i−1) 表示第 iii 个序列由第 xxx 个与 yyy 个按照 x,yx,yx,y 的顺序拼接而成求第 nnn 个序列原创 2022-01-19 20:35:00 · 308 阅读 · 0 评论 -
Atcoder D. Shortest Path on a Line (最短路 + 思维,建图难想
D - Shortest Path on a Line题意:给定 nnn 点,编号从 111 到 nnn,初始图没有边,mmm 次操作,每次给定 l,r,cl,r,cl,r,c,表示编号在区间 [l,r][l,r][l,r] 任意两点之间连有一条长度为 ccc 的边,求最终图中 111 到 nnn 的最短路。思路:这种操作会导致 111 到 iii 的最短路 dis[i]dis[i]dis[i] 出现一个神奇的性质,dis[1]<=dis[2]<=dis[3]...<=dis[n]原创 2021-12-02 16:45:31 · 917 阅读 · 0 评论 -
线段树优化 dijkstra
学习博客P4779 【模板】单源最短路径(标准版)学习新东西肯定先从最简单的开始,先上最短路板子题思路:题解博客线段树优化 Dijkstra我们需要支持三个操作:修改某个点的 disdisdis找到一个没有拿出来过的 disdisdis 最小的点标记某个点已经被拿出来过于是可以用线段树维护区间 disdisdis 的最小值和这个最小值对应的位置。这样子如果一个点已经被拿出来过,我们直接在线段树上把它改成 +∞+\infty+∞,这样子它之后就不会被拿出来了。code:#inclu原创 2021-12-01 22:18:22 · 964 阅读 · 0 评论 -
最小环算法
知乎学习链接最小环概念:在无向图中,最小环至少应当包含 333 个顶点。也就是说,将无向边拆分为两条有向边,以此形成的 222 顶点环,不能视作最小环,有向图则无顶点数的限制。在图论中,一张图的最小环长度也被称为它的围长(girth)。Floyd求无向图最小环该算法最常使用,足以解决绝大多数无向图最小环问题。当最外层恰好循环到 kkk 时,代表着目前所求出的最短路所含的点集为 [1,k)[1,k)[1,k)。这时的中转点 kkk 一定不存在于 iii —> jjj 的最短路中,然后再枚举原创 2021-11-29 21:11:24 · 2519 阅读 · 0 评论 -
ABC 226 E(判断连通块有且仅有一个环
E - Just one题意:给定一个无向图(不一定联通),给边设定方向,使得所有的点出度都为 111,求有多少种方案。思路:单看一个连通块,要满足所有点的出度都为 111,说明连通块必须有环,而且只能存在一个环,如果存在多个环就会使得某个点的出度 >1>1>1。那么总结起来就是每个连通块的点数和边数必须相等这个可以用并查集来求code:#include<bits/stdc++.h>#define endl '\n'#define ll long long原创 2021-11-08 16:51:49 · 363 阅读 · 0 评论 -
2021 RoboCom 世界机器人开发者大赛-本科组(初赛)
7-2 芬兰木棋 (25 分)被这题背刺了,最后才想明白wa点,想了一个小时,草了code:#include<bits/stdc++.h>#define endl '\n'#define ll long longusing namespace std;const int maxn = 1e5 + 9;const int mod = 1e9 + 7;const int inf = 0x3f3f3f3f;ll n, m;int x[maxn], y[maxn], p[maxn]原创 2021-10-11 20:08:14 · 1027 阅读 · 0 评论 -
最短路练习
P1629 邮递员送信题意:nnn 个点,mmm 条边的有向图,每条边花费时间 www,注意边是单向的,每次从 111 出发到达 222 ,返回 111 ,出发到 333 ,返回 111,…直至重复到 nnn求结束时的最小时间花费思路:最暴力的算法, FloyedFloyedFloyed 算法求全源最短路,显然会 TLETLETLE。然后考虑跑 nnn 遍 DijkstraDijkstraDijkstra,复杂度 O(n2logn)O(n^2logn)O(n2logn),实测也 TTT 了仔细原创 2021-10-10 10:22:00 · 173 阅读 · 0 评论 -
EOJ 4335 Connection (转化为求连通块个数
4335. Connection题解:不能通过第二种方法从 000 变成 111 的需要多花费 111,只需要计算有最少有多少个第一种情况。考虑把每一行每一列看成一个独立的点共 (N+M)(N+M)(N+M) 个点,考虑点 (x,y)(x,y)(x,y) 是 111 ,则把对应的行 iii 和列 jjj 连接。那么可以看出,在同一个连通块内的边都可以通过情况 222 得到。所以问题可以转化为连通块个数。code:#include<bits/stdc++.h>using namesp原创 2021-09-15 19:14:22 · 179 阅读 · 0 评论 -
图论专题班——二分图例题与练习
图论专题班——二分图例题与练习Graph Coloring I题意:判定无向连通图是不是二分图如果是输出染色方案,否则输出奇环长和环上点的编号思路:染色判定是是不是二分图dfsdfsdfs 过程将遍历的节点压入栈,判定出现奇环的时候输出编号即可代码中 color[to]=color[x]color[to] = color[x]color[to]=color[x] 表示 xxx 与 tototo 相连形成奇环,遍历奇环的起点为 tototo,终点为 xxx输出即可code:#includ原创 2021-09-12 10:01:08 · 364 阅读 · 1 评论 -
hdu 6947 Stacks(模拟双向链表+建图dfs
Stacks题解栈当成图论中的点,建完图dfscode:#include<bits/stdc++.h>#define ll long long#define endl '\n'using namespace std;const int N = 1e5 + 10;struct node { int l, r;} q[N];int n, m, k;int ans[N];vector<int>e[N];void dfs(int u, int f)原创 2021-09-10 11:00:21 · 167 阅读 · 0 评论 -
牛客 周赛
Simple Game#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e5 + 9;ll n, x, k, m;int f[maxn];bitset <maxn> vis;struct node{ int to,next;}e[maxn << 2];int head[maxn], cnt;void add(int x, int y)原创 2021-08-28 22:14:11 · 310 阅读 · 0 评论 -
UCF 1B G (匈牙利
大佬题解ORZG-Make the Team题意:给你n个视频,每个视频1小时,每个视频有 kik_iki 个时间起点可以观看,一次只能看一个,求最早看完的时间。思路:用时间去匹配课程,完成第n个匹配的时间+1就是答案#include<bits/stdc++.h>#define _ 0using namespace std;const int maxn = 1e5 + 9;int n, m, t;struct edge{ int to, next;}e[maxn];原创 2021-08-25 13:12:58 · 82 阅读 · 0 评论 -
二 分 图
繁凡的博客二分图概念设 G=(V,E)G=(V,E)G=(V,E) 是一个无向图,如果顶点 VVV 可分割为两个互不相交的子集 (A,B)(A,B)(A,B),并且图中的每条边 (i,j)(i,j)(i,j) 所关联的两个顶点i和j分别属于这两个不同的顶点集 (i∈A,j∈B)(i \in A,j \in B)(i∈A,j∈B),则称图 GGG 为一个二分图性质(1)二分图的最大匹配数等于最小覆盖数,即求最少的点使得每条边都至少和其中的一个点相关联,很显然直接取最大匹配的一段节点即可。(2)二分原创 2021-08-08 21:21:40 · 114 阅读 · 0 评论 -
差分约束算法
来自算法竞赛进阶指南的讲解x−y<=kx-y<=kx−y<=k 形式可以转化为 x<=y+kx <= y + kx<=y+k,xxx 会变得尽量小,和最短路一样,yyy 可以用 kkk 去更新 xxx,因此建边add(y, x, k);而 x−y>=kx-y>=kx−y>=k,可以写成 x>=y+kx>=y+kx>=y+k,yyy 会变得尽量大,和最长路一样,yyy 可以用 kkk 更新 xxx,因此建边add(y, x,原创 2021-07-15 14:27:50 · 136 阅读 · 0 评论 -
生成树问题
最小/大生成树学习博客prim模板里的:if(dist[cur] >= INF) return INF;权值最小的点没有更新,代表无法链接所有点,所以不存在学习博客牛客讲解两个最小生成树(Minimum Spanning Tree, MST)算法完全等价。如果输入邻接矩阵,一般用Prim。需要判断重边如果输入边表,一般用Kruskal。不用判断重边Prim算法的优势: 稠密图, 尤其是完全图.因为在Kurscal算法中, 必须事先求出所有边的长度才能对之排序. 但是一个有5000节原创 2021-04-03 11:15:56 · 639 阅读 · 0 评论 -
拓扑 排序
拓扑排序的适用范围:有向无环图(DAG)学习博客原创 2021-04-13 16:51:30 · 729 阅读 · 0 评论 -
最 短 路
单源最短路算法——Dijkstra因为采用链式向前星存图,需要学习一下链式向前星大佬写的链式向前星的讲解原创 2021-04-07 19:05:27 · 275 阅读 · 0 评论