图论

图论 BFS总结

偶尔善良 提交于 2019-11-28 16:36:33
1.关于BFS的Key_word: ①hash或状态压缩记录状态 ②状态剪枝 ③反向BFS ④双向BFS ⑤特殊初始化VIS数组 ⑥动态图的搜索 ⑦优先队列优化搜索 ⑧数位搜索 下面是一一讲解: 1.hash或状态压缩记录状态 :   当状态太多而且边界也广时数组难以存储状态时或者题目对空间的要求较为苛刻,这时候就要使用状态压缩来保存所需的状态或者hash的方式将一个状态对应为一个整数通过一维数组来记录是否访问,当数据过于离散时可以考虑使用map,但是相应的时间复杂度也会上升,如果真的要将所有状态限定在一个较小的范围,可以使用双hash,不过一般的状态相对来说不会太难表示,而是考察对于每个搜索状态的如何设计转移,有点像DP,谁让DP搜索不分家。 2.状态剪枝:   没有剪枝的搜索是没有灵魂的,无论DFS还是BFS,对于DFS而言我们是一层一层的寻找,当我们知道某一子树不可能找的结果,或者说这一状态在具有更有条件时访问过便不再扩展,但是并不代表着,我小于当前最优解就意味着我的子树中不存在最优解,这一段的说明见⑦。但是剪枝需要严谨的证明过程,盲目的剪枝不可取,要根据题目具体设计在状态转移中的剪枝条件,这个在BFS中没有什么规律可循,每一道题都意味着你需要在题目中发掘隐含条件进行剪枝,例如:当到达同一状态时,Dis1<Dis2,那么显而易见,Dis2的后续就要被剪掉

图论模板收录

泪湿孤枕 提交于 2019-11-28 16:02:09
这里主要收录一些与图论有关的模板 啊我还是太弱了居然要收录模板 1.链式向前星 1 //链式向前星(数组模拟邻接表) 2 //单向链表 3 struct pp 4 { 5 int s;//开始 (父亲) 6 int e;//结束 (儿子) 7 int v;//权值 8 int nex; 9 } f[maxn]; 10 int fir[maxn]; 11 int main() 12 { 13 scanf("%d",&n); 14 for(int i=1;i<=n;i++)//n条边 15 { 16 scanf("%d",x,y,z); 17 f[i].s=x; 18 f[i].e=y; 19 f[i].v=z; 20 f[i].nex=fir[x]; 21 fir[x]=i; 22 } 23 for(int i=fir[f];i;i=f[i].nex) 24 dfs;//遍历 25 } 26 27 //双向链表 28 struct pp 29 { 30 int s;//开始 (父亲) 31 int e;//结束 (儿子) 32 int v;//权值 33 int nex; 34 } f[maxn*2]; 35 int fir[maxn]; 36 int tot=0; 37 void build(int x,int y,int z) 38 { 39 f[++tot].e=y; 40 f

图论之欧拉图

柔情痞子 提交于 2019-11-28 15:59:07
欧拉路径/欧拉回路 欧拉路径是一条经过图中所有边且只经过一次的路径(类似于一笔画问题); 欧拉回路的话就是起点和终点相同的欧拉路径 欧拉通路(欧拉路径) :S点到T点的路径经过图中所有的边,有且仅有一次 欧拉回路 :就是起点和终点相同的欧拉路径 欧拉图 :通过图(无向图或有向图)中所有边且每边仅通过一次通路,相应的回路称为欧拉回路 下图p1,p2都不是欧拉图:因为不存在有一条路径能通过所有边且边只经过一次 而下图可以被称为欧拉图: 性质 1.无向连通图 G 是欧拉图,当且仅当 G 不含奇数度结点( G 的所有结点度数为偶数); 2.无向连通图G 含有欧拉通路,当且仅当 G 有零个或两个奇数度的结点; 3.有向连通图 D 是欧拉图,当且仅当该图为连通图且 D 中每个结点的入度=出度; 4.有向连通图 D 含有欧拉通路,当且仅当该图为连通图且 D 中除两个结点外,其余每个结点的入度=出度,且此两点满足 deg-(u)-deg+(v)=±1 。(起始点s的入度=出度-1,结束点t的出度=入度-1 或两个点的 入度=出度); 5.一个非平凡连通图是欧拉图当且仅当它的每条边属于奇数个环; 6.如果图G是欧拉图且 H = G-uv,则 H 有奇数个 u,v-迹仅在最后访问 v ;同时,在这一序列的 u,v-迹中,不是路径的迹的条数是偶数。 求法 对于 无向图 满足以下条件说明该图为 无向欧拉图

图论--最大流 Dinic

此生再无相见时 提交于 2019-11-28 13:50:45
最大流:源点到汇点的流量最大 Dinic基本思想: bfs广搜实现查找 多条增广路 (可能可以增加流量的路),构建一张层次图。 在bfs找到增广路的前提下多次dfs深搜进行增广直至所有已查找到的增广路用完 优化:当前弧优化:    在每次更新完的层次图中(即每一次bfs完后) ,dfs每增广完一条路之后,该路的价值就已可以看作用尽了,没有必要在之后的dfs中再次深搜该路。故记录下用完价值的边的下一条边,下一次的dfs直接从该边开始,这样就避免了不必要的增广。 /* 普通图的情况下:复杂度O(V2 E) 二分图下的复杂度:O(根号(VE)) */ #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int maxv = 10004, maxe = 200004; /*cap 为边的容量 */ struct Edge { int next, to, cap; }e[maxe]; int head[maxv], cnte = 1; int level[maxv], cur[maxv]; int n, m; inline bool min(const int& a, const int& b) { return a<b? a:b; }

【PAT】A1134 Vertex Cover【图论】

天大地大妈咪最大 提交于 2019-11-28 11:04:34
A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at least one vertex of the set. Now given a graph with several vertex sets, you are supposed to tell if each of them is a vertex cover or not. Input Specification: Each input file contains one test case. For each case, the first line gives two positive integers N and M (both no more than 10^​4​​ ), being the total numbers of vertices and the edges, respectively. Then M lines follow, each describes an edge by giving the indices (from 0 to N−1) of the two ends of the edge. After the graph, a positive

图论算法——基本图论算法小结

六眼飞鱼酱① 提交于 2019-11-28 01:17:20
·听了一天的浑浑噩噩 ·这个老师近距离看有点精致可爱,然鹅他过于强 ·老师经典语句: “来我们看一道简单题”,然鹅,是蓝题 “来我们再来看一道题",然鹅,是紫题 tql!!!tjl!!!%%%%% 一、图的入门介绍 ·什么是图?——G(graph)=(V(点),E(边)) 把图进行赋值,所赋值即为权值——点权,边权. ·图的储存 edge:next,to. eg:x——>y next:下一个以x为开头的边在数组的位置 to:y first:以x为开头的第一条边 储存方法:找到最后,在往前倒 板子: struct edge { int next, to; edge() {} edge(int _next, int _to) : next(_next), to(_to) {} } e[M]; void add_edge(int x, int y) { e[++tot] = edge(first[x], y); first[x] = tot; e[++tot] = edge(first[y], x); first[y] = tot; } int main() { for (int x = first[p]; x; x = e[x].next) { //find linkers of point p q = e[x].to; } } 升级版板子(带stl): #include

JAVA图论算法编写迷宫(带界面,自动寻找最优路径+自动生成迷宫)

天大地大妈咪最大 提交于 2019-11-28 01:16:18
JAVA图论算法编写迷宫 图论 迷宫算法 图论 注意:我是边学边写代码的,有的地方没有注释,以致于自己都很难看懂,又不想重复研究,并不保证你也能看懂 关于图论的思考,我是通过以下文章学习的 https://www.cnblogs.com/skywang12345/p/3707604.html#anchor1 无向图的数据结构 (重点) https://www.cnblogs.com/skywang12345/p/3707626.html#anchor1 有向图的数据结构 迷宫算法 关于迷宫算法目前我所知的有遍历 还有 寻找最小值连接 可能你会想,最小值连接是找最短路径? 不是,虽然我之前也以为是这样的. 我所想的是最小值生成随机迷宫 遍历,把所有可能遍历,筛选出最小长度的集合就是最短路径! 我所寻找的算法在如下页面:请仔细观看,不然你无法接着看下去 https://blog.csdn.net/wind_cp/article/details/82948874 等你看的差不多的时候我在讲解哦,关注我,每天详细讲解,一天说一点,不然太多不可能看的下去的. 大概花上8篇文章讲完整个图论生成迷宫和寻找路径**(因为我真的懒)** 之后还要讲解红黑树 +手写hashmap 还有springboot源码解析 但我觉得应该会很久,因为( (因为我真的懒)) https://pan.baidu

python图论包networks(持续更新中)

≯℡__Kan透↙ 提交于 2019-11-28 00:59:24
官方文档: https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.html 最短路: import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() #G.add_node(1) #添加一个节点1 #G.add_edge(2,3,10) #添加一条边2-3(隐含着添加了两个节点2、3) #G.add_edge(3,2) #对于无向图,边3-2与边2-3被认为是一条边 #G.add_weighted_edges_from([(1,2,8)]) #G.add_weighted_edges_from([(1,3,10)]) #G.add_weighted_edges_from([(2,3,6)]) G.add_edge('A', 'B', weight=4) G.add_edge('B', 'D', weight=2) G.add_edge('A', 'C', weight=3) G.add_edge('C', 'D', weight=5) G.add_edge('A', 'D', weight=6) G.add_edge('C', 'F', weight=7) G.add_edge('A', 'G', weight

图论模板

南笙酒味 提交于 2019-11-27 20:36:04
一:最短路 1:Floyd void Floyd() { for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } } View Code extend:Floyd求最小环 for(int i=1;i<=top;i++){ for(int j=1;j<=top;j++){ dis[i][j]=w[i][j]=INF; } } for(int i=1;i<=top;i++){ for(int j=i;j<=top;j++){ if(a[i]&a[j])dis[i][j]=dis[j][i]=w[i][j]=w[j][i]=1; if(i==j)dis[i][j]=w[i][j]=0; } } ll minn=INF; for(int k=1;k<=top;k++){ for(int i=1;i<k;i++){ for(int j=i+1;j<k;j++){ minn=min(minn,dis[i][j]+w[i][k]+w[k][j]); } } for(int i=1;i<=top;i++){ for(int j=1;j<=top;j++){ dis[i][j]=min(dis[i][j]