
图论
文章平均质量分 73
BRCOCOLI
初学者 记录成长 Fighting
展开
-
最小生成树算法(Prim+Kruskal)
Prim算法:首先任取一个点u加入最小生成树1)更新从其他点v出发到u的距离储存在dist中2)然后选一个dist值最小的点u(1)再收入到最小生成树中,再重复1)当点全部收录最小生成树时,算法结束代码如下:#include#include#include#includeusing namespace std;const int INF=1<<30;st原创 2016-08-15 16:34:58 · 366 阅读 · 0 评论 -
求无向连通图边双连通分支
边双连通分支:不包含桥的极大连通子图算法思路:只需在求出所有的桥以后,把桥边删除,原图变成了多个连通块,则每个连通块就是一个边双连通分支。桥不属于任何一个边双连通分支,其余的边和每个顶点都属于且只属于一个边双连通分支。#include#include#include#include #include#includeusing namespace st原创 2016-08-22 16:21:38 · 571 阅读 · 0 评论 -
求桥和割点的Tarjan算法
low[u]定义为u或者u的子树中能够通过非父子边追溯到的最早的节点的DFS开始时间dfn[u]表示dfs下u的开始时间割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点。桥:无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。判断割点方法:(1) u为树根,且u有多于一个子树。(2) u不为树根,且存在(u,v)为树枝边(或称父子边原创 2016-08-22 14:47:09 · 2998 阅读 · 2 评论 -
求无向图连通图点双连通分支
点双连通分支:不包含割点的极大连通子图算法思路:建立一个栈,存储当前双连通分支,在搜索图时,每找到一条树枝边或反向边(连到树中祖先的边),就把这条边加入栈中。如果遇到某树枝边(u,v) 满足dfn(u)一个割点,此时把边从栈顶一个个取出,直到遇到了边(u,v),取出的这些边与其关联的点,组成一个点双连通分支。注意:割点可以属于多个点双连通分支,其余点和每原创 2016-08-22 15:23:35 · 1674 阅读 · 0 评论 -
Tarjan求强连通(缩点)
#include#include#include#include #include#includeusing namespace std;const int maxn=10000+10;bool vis[maxn];int ID[maxn]; //点的颜色编号 int index,ncolor; vector dfn(maxn),low(maxn),st;v原创 2016-08-21 16:48:38 · 245 阅读 · 0 评论 -
Korasaju
procedure Strongly_Connected_Components(G); begin 1.深度优先遍历G,算出每个结点u的结束时间f[u],起点如何选择无所谓。 2.深度优先遍历G的转置图GT,选择遍历的起点时,按照结点的结束时间从大到小进行。遍历的过程中,一边遍历,一边给结点做分类标记,每找到一个新的起点,分类标记值就加1。3. 第2步中产生的标记值相同的结点构成深度优先森原创 2016-08-21 14:12:43 · 433 阅读 · 0 评论 -
有下限的网络流
思路转自博客:http://blog.youkuaiyun.com/water_glass/article/details/6823741上下流相关的网络流的各种问题在Amber大牛的《图论原理》里讲的特备清楚。。。。。资料需要网上下载。。我就把原文摘抄下来吧。。。。。。问题模型:给定一个加权的有向图,满足:(1)容量限制条件:原创 2016-08-19 18:57:35 · 1606 阅读 · 0 评论 -
最小费用网络流
思路:反复用spfa算法做源到汇的最短路进行增广,边权值为边上单位费用。反向边上的单位费用是负的。直到无法增广,即为找到最小费用最大流。成立原因:每次增广时,每增加1个流量,所增加的费用都是最小的。因为有负权边(取消流的时候产生的),所以不能用迪杰斯特拉算法求最短路。因为增广的时候要知道上个节点,这不难,但还要快速的知道其反向边是哪个,这个就比较麻烦而如果用原创 2016-08-19 17:37:41 · 599 阅读 · 0 评论 -
网络流算法
求最大流的过程,就是不断找到一条源到汇的路径,然后构建残余网络,再在残余网络上寻找新的路径,使总流量增加,然后形成新的残余网络,再寻找新路径…..直到某个残余网络上找不到从源到汇的路径为止,最大流就算出来了。每次寻找新流量并构造新残余网络的过程,就叫做寻找流量的“增广路径”,也叫“增广”各种算法的不同之处,也就是在寻找一条从源到汇的过程中进行优化而已1)原创 2016-08-15 15:05:00 · 493 阅读 · 0 评论 -
次小生成树 模板
次小生成树可由最小生成树换一条边得到次小生成树,关键是求MaxVal数组:MaxVal[u][v]保存uv点之间在mst中的边最长的边的长度1)先求一棵MST,利用Prim算法(只能Prim,因为Prim是一个一个收录点的),且在求的时候求出MaxVal数组,更新MaxVal方法如下:prim算法中,已经加入生成树的点集合为W• 往W新增点s时,设 u 属于W,且 s是被连原创 2016-08-18 13:09:16 · 261 阅读 · 0 评论 -
Floyd 模板
求每一对顶点之间的最短路径。有向图,无向图均可,也可以有负权边,但不能存在负环u~v的最短路径 可以通过 dist[u][k1]+dist[k1][k2]+.....+dist[kn-2][kn-1]+dist[kn-1][v]来确定(k最多为n-1个,且这样计算的前提是存在边)#include#include#include#include#includeusing names原创 2016-08-16 19:28:04 · 228 阅读 · 0 评论 -
Bellman_Ford 模板
可以解决有负权边的图,但不能解决有负权回路的图(有负权回路的最短路本来就不存在嘛)思路:假设一共有n个点那么从u~v最多经过n-1个点便肯定能找出最短边(因为最多把其他的边全走一遍就知道最短路径了)所以算法就是:从u(起点)出发,经过1个点到v点试试,如果更加小,就更新一下dist再经过2个点到v点试试,如果更加小,就更新一下dist.........当经过n-1个原创 2016-08-16 15:11:30 · 293 阅读 · 0 评论 -
Dijkstra+堆优化 模板
#include#include#include#include#include#includeusing namespace std;const int maxn=30000+5; struct Edge{int from,to,weight;Edge(int from,int to,int weight):from(from),to(to),weight原创 2016-08-16 13:30:31 · 2990 阅读 · 1 评论