Graph Algorithm
1、定义
A graph consists of a set of vertices V and a set of edges E.
Each edge is a pair (v, w), where v,w belong to V.
路径 A path in a graph is a sequence of vertices w1, w2, ... ,wn.
长度 The length of such a path is the number of edges on the path, which is equal to N-1.
权 Sometimes an edge has a third component, known as either a weight or a cost.
Spanning tree 生成树
假设一个连通图有N 个顶点和e条边,其中n-1 条边和n个顶点构成一个极小连通子图,称该极小连通子图为此树的生成树
2、图的储存表示
1)邻接矩阵表示法
顶点表:记录各个顶点信息的一位数组
邻接矩阵:一个表示各个顶点之间的关系(边或弧)的二维数组。
const MAX_NUM=20; //最大顶点数
typedef int AdjMatrix[MAX_NUM][MAX_NUM]; //邻接矩阵 typedef struct
{
VertexType vexs[MAX_NUM]; //顶点表
AdjMatrix arcs; //邻接矩阵
int vexnum, arcnum; //图实际顶点数与弧数
}MGraph;
在无向图中,第i行(列)1的个数就是顶点i的度。
无向图的邻接矩阵是对称的;
有向图的邻接矩阵可能是不对称的。
在有向图中,第i行1的个数就是顶点i的出度,第j列1的个数就是j的入度
如果有权值的存在,则也可以在邻接矩阵上加上
2)邻接表
以一种链式结构形式的存储结构
typedef struct ArcNode
{
int ajdvex; //该弧所指向结点的位置
ArcNode* nextArc; //指向下一条弧指针
InfoNode info; //弧所带信息,可以是权值
}ArcNode; typedef struct VNode
{
VertexType data; //顶点信息
ArcNode* firstArc; //指向第一条依附该结点的弧的位置
}VNode, Adjist[MAX_NUM][MAX_NUM]; typedef struct
{
Adjist verties; //邻接表
int vexnum, arcnum;
int kind; //图的种类
}ALgraph;
带权图的边结点中info保存改变上的权值。
顶点Vi的边链表的头结点存放在下标为i的顶点数组中。
在邻接表的边链表中,各个边结点的链入顺序任意,视边结点输入次序而定。
设图中有n个结点,e条边,则用邻接表表示无向图时,需要n个顶点结点,2*e个边结点;
用邻接表表示有向图时,若不考虑你邻接表,只需n个顶点结点,e个边结点。
建立邻接表的时间复杂度为O(n*e),若顶点信息为顶点的下标,则时间复杂度为O(n+e).
3、图的遍历
从图的某一个顶点出发访问遍图中其余顶点,且使每个顶点仅被访问过一次,就叫做图的遍历。
为避免重复访问,可设置一个表示顶点是否被访问过的辅助数组visited[],它的初始状态设置为0,一旦某个结点被访问过则立即让对应的visited[i]=1
1)DFS 深度优先搜索
算法思想:
从图的某一结点v开始,由v出发,访问它的任一邻接顶点w1;再从w1出发,访问与w1邻接但还没有访问过的顶点w2;再从w2出发,进行类似的访问,…… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止。接着,退回一步,退到前一次刚访问过的顶点,看是否还有其他没有访问过的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与上述类似的访问;如果没有,就在退回一步进行搜索,重复上述过程,直到连通图中所有顶点都被访问过为止。(贪心算法?)
进一步描述:
(1)从图中某个顶点v出发,访问之;
(2)依次从顶点v的未被访问过的邻接点出发,深度优先遍历图,直到图中所有和顶点v有路径相同的顶点都被访问到;
(3)若此时图中尚有顶点未被访问到,则另选一个未被访问过的顶点作起始点,重复上述(1)(2)的操作,直到图中所哟的顶点都被访问到为止。
//DFS
//遍历算法
void Graph_Traverse(AdjGraph G)
{
int* visited = new int[NumVertices];
for(int i=0; i<G.n;i++)
visiter[i]=0; //访问数组visited初始化
for(int i=0;i<G.n;i++)
if(!visited[i])DFS(G, i, visited); delete[] visited;
} void DFS(AdjGraph G, int v, int visited[])
{
cout<<GetValue(G,v)<<" "<<endl; //访问顶点v
visited[v]=1;
int w=GetFirstNeighbor(G,v); //取v的第一个邻接顶点w
while(w!=-1)
{
if(!visited[w])DFS(G,w,visited); //若顶点w未访问过,递归访问顶点w
w=GetNextNeighbor(G,v,w); //取顶点v排在w后下一个邻接顶点
}
}
图中有n个顶点,e条边。
如果用邻接表表示图,沿Firstarc->nextarc 链可以找到某个顶点v 的所有邻接顶点w。由于总共有2e个边结点,所以扫描边的时间为O(e),而且对所有顶点递归访问1次,时间复杂度为O(n+e)
如果用邻接矩阵表示图,则查找每一个顶点的所有的边,所需时间为O(n),则时间复杂度为O(n^2).
2) 广度优先搜索BFS
算法思想:
访问了起始顶点v后,由v出发,依次访问v的各个未被访问过的邻接顶点w1, w2, w3,..., wt, 然后在顺序访问w1, w2, ... ,wt的所有还未被访问过的邻接顶点。再从这些访问过的邻接顶点出发,再访问它们的所有还未被访问过的邻接顶点,……如此做下去,直到图中所有顶点都被访问到为止。
进一步描述:
(1)从图中的某个顶点v出发,访问之;
(2)依次访问顶点v的各个未被访问过的邻接点,将v的全部邻接点都访问到;
(3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,并使“先被访问过的顶点的邻接点” 先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问过的顶点的邻接点都被访问到。
//BFS
void Graph_Traverse(AdjGraph G)
{
int* visited = new int[NumVertices];
for(int i=0; i<G.n;i++)
visited[i]=0;
for(int i=0;i<G.n;i++)
if(!visited[i])BFS(G,i,visited); delete[] visited;
} void BFS(AdjGraph G, int v, int visited[])
{
cout<<GetValue(G, v)<<" "<<endl; //访问结点
Queue<int>q; //用队列来储存着一层正在访问的结点
InitQueue(&q);
EnQueue(&q,v); //进队列
while(!QueueEmpty(&q))
{
Dequeue(&q,v);
int w = GetFirstNeighbor(G,v);
while(w!=-1)
{
if(!visited[w])
{
cout<<GetValue(G, w)<<" "<<endl;
visited[w]=1;
EnQueue(&q, w);
}
w=GetNextNeighbor(G,v,w);
}
}
delete[] visited;
}
算法分析:
如果使用邻接表表示图,则循环的总时间代价为d0+d1+d2+ ... +d(n-1)=O(e),其中的di是顶点i的度。
如果使用邻接矩阵,则对于每一个被访问过的顶点,循环要检测矩阵中的n个元素,总的时间代价为O(n^2).
Graph Algorithm的更多相关文章
- [Algorithm] 如何正确撸<算法导论>CLRS
其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话 ...
- Algorithm lesson final exam
1.algorithm analysis O B/W/AV/AMOR,混入其他问题,设计+分析 2.传统算法(肯定要考) 1)divide and conquer master therem. rec ...
- GraphX 在图数据库 Nebula Graph 的图计算实践
不同来源的异构数据间存在着千丝万缕的关联,这种数据之间隐藏的关联关系和网络结构特性对于数据分析至关重要,图计算就是以图作为数据模型来表达问题并予以解决的过程. 一.背景 随着网络信息技术的飞速发展,数 ...
- Neo4j 3.0 存储过程
Neo4j 3.0 提供一个新的功能“存储过程”,该功能并不是Neo4j-Server的扩展,而是可以直接运行的. 在写这篇文章的时候,只能通过预备好的语句去执行 1 CALL package.pro ...
- 某Facebook工程师写的攻略。
Chapter 1 Interesting read, but you can skip it. Chapter 2 2.1 Insertion Sort - To be honest you sho ...
- assembly|reads to contig|contig to scaffold|coverage|depth| tandem repeats
(组装方面):SOAPdenovo ,因为采用de Bruijn graph algorithm算法和stepwise strategy ,所以排错能力高,所以我们获得高质量数据. de Bruijn ...
- algorithm@ Shortest Path in Directed Acyclic Graph (O(|V|+|E|) time)
Given a Weighted Directed Acyclic Graph and a source vertex in the graph, find the shortest paths fr ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 7. Graph Algorithms and Implementation Techniques
uva 10803 计算从任何一个点到图中的另一个点经历的途中必须每隔10千米 都必须有一个点然后就这样 floy 及解决了 ************************************* ...
随机推荐
- (Nginx学习一)安装和启动及对应文件夹介绍
nginx 安装和启动及对应文件夹介绍 1 安装 官网下载nginx文件 http://nginx.org/en/download.html 解压即可 2 文件夹介绍 在解压后nginx压缩包后发现 ...
- c#:readonly与const的区别
readonly与const的区别: 1.初始化:const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 2.值: const 字段是编译时常量(con ...
- SAP HANA学习资料大全[非常完善的学习资料汇总]
Check out this SDN blog if you plan to write HANA Certification exam http://scn.sap.com/community/ha ...
- Signalr 实现心跳包
项目分析: 一个实时的IM坐席系统,客户端和坐席使用IM通信,客户端使用android和ios的app,坐席使用web. web端可以保留自己的登录状态,但为防止意外情况的发生(如浏览器异常关闭,断网 ...
- OpenGL编译问题随手记
1.error C2381: "exit" : 重定义:__declspec(noreturn) 不同 编译OpenGL Red Book 的例子时出现错误, stdl ...
- WinForms 实现气泡提示窗口(转载)
[实例说明] 气泡提示因为他的美观又好被大多数用户所接收,用户所喜爱的就是程序员要实现的. 本实例实现了任务栏气泡提示,运行本实例,效果图如下所示: 单击提示.气泡提示就会显示,单击“关闭”气泡又会消 ...
- [Q]无矩形外框块参照图形的识别
该图纸的图框由块参照组成,其外侧图框不是矩形 使用默认设置无法正确识别,需要做以下修改:不勾选“块/外部参照”,勾选“块/外部参照边界”,勾选“制定块”并选择图框(块参照).
- Zeppelin0.5.6使用hive解释器
此zeppelin为官方0.5.6版,可能还在孵化阶段,可能出现一些bug吧. 配置 cp zeppelin-env.sh.template zeppelin-env.sh vi zeppelin-e ...
- C# 语言规范_版本5.0 (第15章 委托)
1. 委托 **(注:此章非常重要,特别是对于图形界面相关的区别于MFC和QT等的消息机制,委托是基石.) 委托是用来处理其他语言(如 C++.Pascal 和 Modula)需用函数指针来处理的情况 ...
- 每天学习一点点...css...
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...