图论算法总结及图论建模PPT文件格式下载.ppt
《图论算法总结及图论建模PPT文件格式下载.ppt》由会员分享,可在线阅读,更多相关《图论算法总结及图论建模PPT文件格式下载.ppt(121页珍藏版)》请在冰豆网上搜索。
![图论算法总结及图论建模PPT文件格式下载.ppt](https://file1.bdocx.com/fileroot1/2022-10/10/393ebeaf-46fe-414e-81fb-5234d6759446/393ebeaf-46fe-414e-81fb-5234d67594461.gif)
边的子集和相关联的点集边的子集和相关联的点集图的基本概念有向图:
边都是单向有向图:
边都是单向(unidirectional)的的,因此边因此边(u,v)是有序数是有序数对对.有时用弧有时用弧(arc)专指有向边专指有向边带权图:
可以给边加权带权图:
可以给边加权(weight),成为带权图成为带权图,或加权图或加权图(weightedgraph).权通常代表费用、距离等权通常代表费用、距离等,可以是正数可以是正数,也可也可以是负数以是负数稠密性:
边和稠密性:
边和V(V-1)/2相比非常少的称为稀疏图相比非常少的称为稀疏图(sparsegraph),它的补图为稠密图它的补图为稠密图(densegraph)路径和圈一条路径一条路径(path)是一个结点序列是一个结点序列,路上的相邻结点在图上是邻接路上的相邻结点在图上是邻接的的如果结点和边都不重复出现如果结点和边都不重复出现,则称为简单路径则称为简单路径(simplepath).如果如果除了起点和终点相同外没有重复顶点和边除了起点和终点相同外没有重复顶点和边,称为圈称为圈(cycle).不相交路不相交路(disjointpath)表示没有除了起点和终点没有公共点的表示没有除了起点和终点没有公共点的路路.更严格地更严格地-任意点都不相同的叫严格不相交路任意点都不相同的叫严格不相交路(vertex-disjointpath)-同理定义边不相交同理定义边不相交(edge-disjointpath)路路注意注意:
汉语中圈和环经常混用汉语中圈和环经常混用(包括一些固定术语包括一些固定术语).由于一般不讨由于一般不讨论自环论自环(self-loop),所以以后假设二者等价而不会引起混淆所以以后假设二者等价而不会引起混淆连通性如果任意两点都有路径如果任意两点都有路径,则称图是连通则称图是连通(connected)的的,否则称图否则称图是非连通的是非连通的.非连通图有多个连通分量非连通图有多个连通分量(connectedcomponent,cc),每个连通分每个连通分量是一个极大连通子图量是一个极大连通子图(maximalconnectedsubgraph)完全图和补图完全图完全图:
N个顶点的图,有个顶点的图,有N(N-1)/2个节点个节点对于对于(u,v),若邻接则改为非邻接若邻接则改为非邻接,若非邻接则改为邻接若非邻接则改为邻接,得到的得到的图为原图的补图图为原图的补图完全图完全图=原图原图补图补图团:
完全子图团:
完全子图生成树树:
树:
N个点,个点,N-1条边的连通图(无环连通图)条边的连通图(无环连通图)生成树生成树:
包含某图包含某图G所有点的树所有点的树一个图一个图G是树当且仅当以下任意一个条件成立是树当且仅当以下任意一个条件成立G有有V-1条边条边,无圈无圈G有有V-1条边条边,连通连通任意两点只有唯一的简单路径任意两点只有唯一的简单路径G连通连通,但任意删除一条边后不连通但任意删除一条边后不连通图例图的表示方法介绍两种图的表示方法:
邻接矩阵与邻接表介绍两种图的表示方法:
邻接矩阵与邻接表V*V的二维数组的二维数组A,Aij=0,若若(i,j)不相连,不相连,Aij=1,若若(i,j)相连相连图图1图图1的邻接矩阵表示的邻接矩阵表示邻接矩阵无向图的邻接矩阵是对称的无向图的邻接矩阵是对称的优点:
查找优点:
查找/删除某条边是删除某条边是O
(1)的的缺点缺点遍历某一点的邻居是遍历某一点的邻居是O(V)的的空间复杂度很大,空间复杂度很大,O(V*V)每个结点的邻居形成一个链表每个结点的邻居形成一个链表邻接表图图2图图2的邻接表表示的邻接表表示优点优点快速遍历某点所有邻居快速遍历某点所有邻居占用存储空间小,是占用存储空间小,是O(边数)的,在稀疏图上的效率远胜邻(边数)的,在稀疏图上的效率远胜邻接表接表缺点:
查找缺点:
查找/删除边不是常数时间删除边不是常数时间邻接表一、宽度优先遍历一、宽度优先遍历(BFS)(BFS)二、深度优先遍历二、深度优先遍历(DFS)(DFS)图的遍历算法给定图给定图G和一个源点和一个源点s,宽度优先遍历按照从近到远的顺序考虑各条宽度优先遍历按照从近到远的顺序考虑各条边边.算法求出从算法求出从s到各点的距离到各点的距离宽度优先的过程对结点着色宽度优先的过程对结点着色.白色白色:
没有考虑过的点没有考虑过的点黑色黑色:
已经完全考虑过的点已经完全考虑过的点灰色灰色:
发现过发现过,但没有处理过但没有处理过,是遍历边界是遍历边界依次处理每个灰色结点依次处理每个灰色结点u,对于邻接边对于邻接边(u,v),把把v着成灰色并加入树着成灰色并加入树中中,在树中在树中u是是v的父亲的父亲(parent)或称前驱或称前驱(predecessor).距离距离dv=du+1整棵树的根为整棵树的根为s宽度优先遍历(BFS)题目大意:
题目大意:
给出给出N*M个格子,给出个格子,给出K个已经被淹没的格子,其他格子都是个已经被淹没的格子,其他格子都是干的,求最大的湖的面积(一个格子的面积视为干的,求最大的湖的面积(一个格子的面积视为1),如果两个),如果两个湿的格子四联通(上下左右),则视为这两个格子同属于一个湖湿的格子四联通(上下左右),则视为这两个格子同属于一个湖输入格式:
输入格式:
第一行第一行N,M,K接下来接下来K个格子的坐标个格子的坐标AvoidTheLakes(NOI题库2405)Input3453222312311Output4样例解释样例解释#.#.#.新发现的结点先扩展新发现的结点先扩展得到的可能不是一棵树而是森林得到的可能不是一棵树而是森林,即深度优先森林即深度优先森林(Depth-firstforest)特别之处特别之处:
引入时间戳引入时间戳(timestamp)发现时间发现时间dv:
变灰的时间变灰的时间结束时间结束时间fv:
变黑的时间变黑的时间1=dvfv=2|V|深度优先遍历(DFS)初始化初始化:
time为为0,所有点为白色所有点为白色,dfs森林为空森林为空对每个白色点对每个白色点u执行一次执行一次DFS-VISIT(u)时间复杂度为时间复杂度为O(n+m)深度优先遍历(DFS)括号结构性质括号结构性质对于任意结点对对于任意结点对(u,v),考虑区间考虑区间du,fu和和dv,fv,以下三个性质恰有一个成立以下三个性质恰有一个成立:
完全分离完全分离u的区间完全包含在的区间完全包含在v的区间内的区间内,则在则在dfs树上树上u是是v的后代的后代v的区间完全包含在的区间完全包含在u的区间内的区间内,则在则在dfs树上树上v是是u的后代的后代DFS树的性质定理定理(嵌套区间定理嵌套区间定理):
在在DFS森林中森林中v是是u的后代当且仅当的后代当且仅当dudvfvfu,即即区间包含关系区间包含关系.由区间性质立即得到由区间性质立即得到.DFS树的性质一条边一条边(u,v)可以按如下规则分类可以按如下规则分类树边树边(TreeEdges,T):
v通过边通过边(u,v)发现发现后向边后向边(BackEdges,B):
u是是v的后代的后代前向边前向边(ForwardEdges,F):
v是是u的后代的后代交叉边交叉边(CrossEdges,C):
其他边,可以连接同一个其他边,可以连接同一个DFS树中没树中没有后代关系的两个结点有后代关系的两个结点,也可以连接不同也可以连接不同DFS树中的结点树中的结点判断后代关系可以借助定理判断后代关系可以借助定理1边的分类当当(u,v)第一次被遍历第一次被遍历,考虑考虑v的颜色的颜色白色白色,(u,v)为为T边边灰色灰色,(u,v)为为B边边(只有它的祖先是灰色只有它的祖先是灰色)黑色黑色:
(u,v)为为F边或边或C边边.此时需要进一步判断此时需要进一步判断dudv:
C边边(v早就被发现了早就被发现了,为另一为另一DFS树中树中)时间复杂度时间复杂度:
O(n+m)定理定理:
无向图只有无向图只有T边和边和B边边(易证易证)边分类算法if(dv=-1)dfs(v);
/树边树边,递归遍历递归遍历elseif(fv=-1)show(“B”);
/后向边后向边elseif(dvdu)show(“F”);
/前向边前向边elseshow(“C”);
/交叉边交叉边d和和f数组的初值均为数组的初值均为-1,方便了判断方便了判断实现细节实现细节DAG:
有向无环图有向无环图拓扑顺序:
拓扑顺序:
拓扑排序算法对图对图G使用使用DFS算法算法,每次把一个结点变黑的同时加到链表首部每次把一个结点变黑的同时加到链表首部ANEXAMPLE定理定理1:
有向图是有向图是DAG当且仅当没有返祖边当且仅当没有返祖边如果有返祖边如果有返祖边,有环有环(易证易证)如果有环如果有环c,考虑其中第一个被发现的结点考虑其中第一个被发现的结点v,环中环中v的上一个结点为的上一个结点为u,则则沿环的路径沿环的路径vu是白色路径是白色路径,u是是v的后代的后代,因此因此(u,v)是返祖边是返祖边定理定理2:
该算法正确的得到了一个拓扑顺序的逆序该算法正确的得到了一个拓扑顺序的逆序拓扑排序算法一、有向图一、有向图:
SCC划分的划分的Kosaraju算法算法(有兴趣的同学自己看吧有兴趣的同学自己看吧)二、有向图二、有向图:
SCC划分的划分的Tarjan算法算法三、无向图三、无向图:
割顶和桥的判定割顶和桥的判定图的连通性算法有向图中有向图中,u可达可达v不一定意味着不一定意味着v可达可达u.相互可达则属于同一个强连通分量相互可达则属于同一个强连通分量(StronglyConnectedComponent,SCC)有向图和它的转置的强连通分量相同有向图和它的转置的强连通分量相同所有所有SCC构成一个构成一个DAGSCC的概念Tarjan算法是基于对图深度优先搜索的算法算法是基于对图深度优先搜索的算法每个强连通分量为搜索树中的一棵子树每个强连通分量为搜索树中的一棵子树搜索时,把当前搜索树中未处理的节点加入一个堆栈搜索时,把当前搜索树中未处理的节点加入一个堆栈回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
tarjan算法(参考byvoid博客)定义:
定义:
DFN(u)为节点为节点u搜索的次序编号搜索的次序编号(时间戳时间戳)Low(u)为为u或或u的子树能够追溯到的最早的栈中节点的次序号的子树能够追溯到的最早的栈中节点的次序号当当DFN(u)=Low(u)时,以时,以u为根的搜索子树上所有节点是一个强为根的搜索子树上所有节点是一个强连通分量。
连通分量。
dfn与low函数算法伪代码tarjan(u)DFNu=Lowu=+Index/为节点为节点u设定次序编号和设定次序编号和Low初值初值Stack.push(u)/将节点将节点u压入栈中压入栈中foreach(u,v)inE/枚举每一条边枚举每一条边if(visnotvisted)/如果节点如果节点v未被访问过未被访问过tarjan(v)/继续向下找继续向下找Lowu=min(Lowu,Lowv)elseif(vinS)/如果节点如果节点v还在栈内还在栈内Lowu=min(Lowu,DFNv)if(DFNu=Lowu)/如果节点如果节点u是强连通分量的根是强连通分量的根repeatv=S.pop/将将v退栈,为该强连通分量中一个顶点退栈,为该强连通分量中一个顶点p