图的基础知识

一、图的基本概念

· 有向图和无向图


· 稀疏图:边数相对少的图

       稠密图:边数相对较多的图


· 完全图:任意两顶点间都有边相关联

      完全有向图


· 邻接顶点、子图、权

        网路:带权图


· 度、出度、入度、路径


· 路径长度:非带权图的路径长度是指此路径上边的条数;带权图的路径长度是指路径上各边的权之和。

      简单路径:路径上各点不重复。

      回路:路径上第一个顶点与最后一个顶点重合。


· 连通图:图中任意一对顶点都是连通的

     连通分量:非连通图的极大连通子图

      强连通图:连通图是有向图

      强连通分支\强连通分量:有向强连通的极大子图


· 连通图的生成树:含有该连通图所有顶点的极小连通子图

      若连通图的顶点个数为n,则其生成树有n-1条边;但是有n-1条边的子图不一定是生成树。

      在最小生成树上加一条边,一定会有环。


· 若是连通图,从图中任意一个顶点出发,可以访问图中所有顶点


二、图的存储表示

1、邻接矩阵:

·用一个二维数组表示grap[n][n],对于一个n个结点的图,其空间代价为O(n^2);一般我习惯用1表示两个顶点连接,0表示不 连接。

·若是有向带权(正)图,-1表示不连接,0表示自己和自己连接,正数表示权值。


2、邻接表:

·由一个顺序存储的顶点表和n个链接存储的边表组成。 

顶点表:包含顶点编号以及指向此顶点边表的指针

边表:单链表,包含该边另一顶点的编号以及指向一下条边的指针(如果是有权图还要加一项权值)

例图:

图的基础知识_第1张图片

例题:

图的基础知识_第2张图片

· 邻接表的特点总结:

a、若图有n个顶点e条边,则:

无向图:n个顶点结点,2e个边结点

有向图:n个顶点结点,e个边结点

b、有向图中求某结点的入度必须遍历整个表格

c、在邻接表的边链表中,各个边结点的链入顺序任意,视边结点输入次序而定,往往按照顶点编号从小到大排列。在边或弧稀疏的条件下,用邻接表表示比用邻接矩阵表示节省存储空间。 


3、邻接多重表

边结点结构:

mark:记录是否处理过该边

vertex1\vertex2:该边两顶点

path1\path2:指向下一条依附顶点的边

顶点结点结构:

图的基础知识_第3张图片

Firstout:指向第一条依附该顶点的边

例图:

图的基础知识_第4张图片

· 要学会根据邻接表和多重邻接表进行深搜和广搜


三、图的遍历与连通性


· 图的遍历:沿一些边访问图中所有的结点,且每个顶点仅访问一次。

· 遍历图通常需要一个辅助数组visited[],若访问过该结点,则相应的位置置一。

· 图的遍历的分类:

1、深度优先搜索

·递归实现

·非递归实现,代码如下:

memset(visited,0,sizeof(visited));
stack store;
visited[start] = 1;
store.push(start);
while(!store.empty())
{
	int tem = store.top();
	bool pd = false;
	for (int i = 0;i < n;i ++)
	{
		if (map[tem][i] == 1 && visited[i] == 0)
		{
			visited[i] = 1;
			store.push(i);
			pd = true;
			break;  
		}
	}
	if (pd == false)
		store.pop();
}

2、广度优先搜索

使用队列实现


四、深搜广搜的应用

· 学会使用两种遍历算法生成生成树


·如何求有向图的强连通分量

(1) 对G进行深度优先遍历,生成G的深度优先生成森林T 

(2) 对森林T的顶点按中序遍历顺序进行编号。

(3) 改变G中每一条弧的方向,构成一个新的有向图G’

(4) 按(2)中标出的顶点编号,从编号最大的顶点开始对G’进行深度优先搜索,得到一棵深度优先生成树。若一次完整的搜索过程没 有遍历G’的所有顶点,则从未访问的顶点中选择一个编号最大的顶点,由它开始再进行深度优先搜索,并得到另一棵深度优先生 成树。在该步骤中,每一次深度优先搜索所得到的生成树中的顶点就是G的一个强连通分量的所有顶点。

(5) 重复步骤(4) ,直到G’中的所有顶点都被访问。如下图是求一棵有向树的强连通分量过程。 

图的基础知识_第5张图片



你可能感兴趣的:(图的基础知识)