图论
文章平均质量分 72
本居小鈴
无尽深渊中,唯有你与我共行。
展开
-
Tarjan算法(强连通分量)与缩点
Tarjan算法文章目录Tarjan算法简介前置知识强连通分量dfs过程产生的边算法时间戳过程代码实现缩点缩点的应用例题 P2746 [USACO5.3]校园网Network of Schools简介Tarjan算法可以求出一个有向图中的强连通分量的个数,同时还可以将强连通分量改造为一个点,也就是所谓的“缩点”。前置知识强连通分量强连通分量(或者极大连通子图),指的是在一个子图中,所有点能够两两互达,且再加入新的点时将破坏连通性。特别要注意的是,一个点可以被认为是一个强连通分量。dfs过程产生原创 2022-05-27 12:06:40 · 263 阅读 · 0 评论 -
【日志】Kruskal重构树
Kruskal重构树原创 2022-03-09 20:57:06 · 247 阅读 · 0 评论 -
【模板】Kruskal重构树
Kruskal 重构树模板知识点Kruskal 算法LCA(倍增LCA或者Trajan算法)模板这里使用用倍增LCA。例题为:P1967 火车运输。除了Kruskal求生成树含在main函数里面,其他都已经用结构体封装好。#include <bits/stdc++.h>using namespace std;#define all(x) std::begin(x), std::end(x)const int MAXN = 1e6 + 10;int n, m;vec原创 2022-03-09 10:56:24 · 224 阅读 · 0 评论 -
【日志】LCA 倍增求法
LCA 倍增法这里是求树上两点最近公共祖先的倍增求法。倍增简单来说,倍增就是:1,2,4,8,16,32,⋯1,2,4,8,16,32,\cdots1,2,4,8,16,32,⋯像上面这个数列(其实准确来讲应该是思维),任何大于0的正整数,它都能够表示,这就是倍增。倍增求LCA这个点的祖先不考虑如何求得那个祖先。考虑这个结点到祖先节点的路径,发现使用上面的倍增方法可以很好的描述(因为上面那个玩意可以很好的表达出这条路径长度嘛)。考虑从小到大去表示这条路径,会发现很难描述用上面的方法如何原创 2022-03-03 19:31:54 · 371 阅读 · 0 评论 -
【日志】拓扑排序及其一些小知识点
拓扑排序主要是之前遇到一道拓扑排序的题目,DFS的拓扑排序没写过,BFS的太久没写又给忘了几个细节,必须总结一下知识点了(就是水题写太多了)拓扑排序的作用就是给图中的结点进行排序,这个图必须是一个有向无环图(DGA)。拓扑排序执行后,被排序的结点将排列到一条水平线上,一个点的后继点一定在这个点后面(如果存在的话)。实现方法有两种实现方法,一种是使用BFS,另一种是使用DFS。下面的代码实现方式不一定是最好的,只是要简单易懂而写的BFS大致步骤如下。记录每个结点的入度和出度的情况,入度为0原创 2022-03-01 00:19:31 · 395 阅读 · 0 评论 -
【日志】邻接矩阵的k次方
图 邻接矩阵的k次方感觉挺有意思的这个小性质使用一个矩阵来存储图,如下。(aija_{i j}aij代表的是从iii到jjj存在有一条边)。A=[011101110]A =\begin{bmatrix}0&1&1\\1&0&1\\1&1&0\end{bmatrix}A=⎣⎡011101110⎦⎤当把这个矩阵平方后,可以得到这样的一个矩阵。B=A2=[211121112]B=A^2 = \begin{bmatrix}2原创 2022-01-26 21:17:32 · 1190 阅读 · 0 评论 -
【日志】负环 差分约束
文章目录负环差分约束题目 P3275 [SCOI2011]糖果负环如果图中存在权值为负的边,且产生了一个环,环上各边的权值和为负值,那么这个环就成为了负环。一旦图中存在负环,那么将会导致一遍又一遍地更新最短路。Dijkstra算法不可以用于判断负环(其实图里面有负值边的都不可以用,因为松弛dist的时候负值边会导致dist可能不是最小),可以用Bellman-Ford或者队列优化的Bellman-Ford(SPFA)判断负环。vector<vector<PII>>g;vec原创 2022-01-11 18:26:49 · 172 阅读 · 0 评论