随笔分类 - 1.3 搜索与图论
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 510, M = 100010; 4 int h[N], e[M], ne[M], idx; 5 int n1, n2, m; 6 bool st[N]; //判重 7
阅读全文
摘要:性质:一个图是二分图,当且仅当图中不含奇数环 奇数环:环中边的数量是奇数 二分图:我们能把所有点分为两边,集合内部是没有边的 这个图能被2染色 染色法:一条边的端点颜色不同 由于图中不含奇数环,这个染色过程中一定是没有矛盾的 1 #include <bits/stdc++.h> 2 using na
阅读全文
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 200010; 4 struct edge { 5 int a, b, w; 6 friend bool operator < (edge e1, edge e2) {
阅读全文
摘要:最小生成树的图对应的图都是无向图,最小生成树没有自环 稠密图用朴素版的Prim算法,O(n ^ 2) 稀疏图用堆优化版的Prim算法,O(m log n) Kruskal算法,O(m log m)和O(m log n)级别一样,m < n ^ 2,先对所有边从小到大排序 如何选择: 稠密图直接朴素版
阅读全文
摘要:用邻接矩阵来存储 Floyd算法原理是动态规划 d[k, i, j]表示:从i这个点,只经过从1~k这些点,到达j点的最短距离 然后k这一维可以去掉 Floyd算法可以有负权,但不能有负权回路,不然最短距离会变成负无穷 1 #include <bits/stdc++.h> 2 using names
阅读全文
摘要:spfa算法判断负环时间复杂度最坏nm 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 10010; 4 int h[N], e[N], ne[N], idx, w[N]; 5 int dist[N], cnt[N]
阅读全文
摘要:spfa算法实际上是对bellman-ford算法进行了优化 spfa算法一定要求图中不含负环 dist[b]想变小,一定是dist[a]变小了 spfa用宽搜来做优化 队列里面就是所有变小的节点a,只要一个节点变小了,就把它放进队列里面然后去更新它的后继 spfa也可以适用于Dijkstra算法解
阅读全文
摘要:可以开一个结构体存储所有边 这个更新的过程叫做松弛操作 bellman-ford算法循环完之后,所有边的距离一定满足 这个叫三角不等式 在求最短路的时候,如果有负权回路的话,最短路是不一定存在的 bellman-ford算法可以求出来是不是有负权回路,负环,时间复杂度O(nm) 第一层for循环的循
阅读全文
摘要:堆优化版的Dijkstra算法 稀疏图 找最小距离这一步是最慢的,在一堆数中找一个最小的数,所以可以用堆优化,可以变为O(1) 用堆来存储,所有点到起点的最短距离 然后修改其他数的时间复杂度每次是log n,一共修改m次 这里的堆有两种实现方式 1.手写堆:好处:可以时时刻刻保证堆里面只有n个数,支
阅读全文
摘要:稠密图用邻接矩阵 稀疏图用邻接表 最短路问题 只有一个起点是单源 多个起点是多源 n是点的数量,m是边的数量 朴素Dijkstra算法的时间复杂度和边数无关,适合稠密图(边数较多时),m和n ^ 2一个级别时 堆优化版的Dijkstra算法适用于稀疏图,n和m一个级别 SPFA算法是对Bellman
阅读全文
摘要:图的宽搜的一个经典应用就是求拓扑排序 拓扑排序是针对有向图而言,无向图没有拓扑序列 比如这个有向图 图中的边一共是1到2,2到3,1到3,对于每条边都是起点在终点的前面 1 2 3就是一个拓扑序列,都是从前指向后的 并不是所有图都有拓扑序列 只要有一个环,无论如何都不可能有拓扑序列 一个有向无环图,
阅读全文
摘要:因为这道题的边长为1,所以可以用宽搜 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 100010; 4 int h[N], e[N], ne[N], idx; 5 int d[N]; 6 int n, m; 7 v
阅读全文
摘要:树和图有两种存储方式,树是一种特殊的图,树是无环连通图 图分为有向图和无向图,无向图是一种特殊的有向图 所以就只需要考虑有向图怎样存储 有向图的存储有两大类 第一大类是用得比较少的邻接矩阵,就是开个二维数组g[a][b]存储a到b这条边的信息,这条边有权重就记录权重,没权重就记录这条边是否存在,0或
阅读全文
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 //用哈希表来存所有距离 4 int bfs(string start) { 5 string end = "12345678x"; //终止状态 6 queue<string> q; //宽搜的
阅读全文
摘要:所有边的权重都是1时,才可以用BFS求最短路 否则要用专门的最短路算法来求最短路 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef pair<int, int> PII; 4 queue<PII> q; 5 int n, m; 6
阅读全文
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 //像全排列那样搜 4 //每一行都必须要放一个皇后也只能放一个皇后 5 //先看第一行皇后可以放在哪一列 6 const int N = 20; 7 char ans[N][N]; 8 bool
阅读全文
摘要:DFS需要考虑搜索顺序 这道题的搜索顺序是: 假定一开始有n个空位了 然后从左往右,从第一位开始填 每一次填的时候,要填的数字不能和前面一样 回溯时要记得恢复现场 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 10
阅读全文

浙公网安备 33010602011771号