【图论】图论算法(一)——概念与无向图的邻接矩阵

基本概念

又进入了繁杂的概念之中……

概念

图是一种数据结构,表现对象集合及其间关系的集合。
图的对象称为结点或顶点,“关系”表示顶点与顶点之间的关系,称为边。
举个例子:
这里写图片描述
以上就是一个普通的无向图。

分类

图可以分为四类,用来处理不同类型的问题。

名称 特征
无向图 边没有方向的图
有向图 边有方向的图
加权无向图 边有权(值)但没有方向的图
加权有向图 边有权(值)但有方向的图

术语

顶点集合为 V ,边集合为 E 的图记作 G = ( V , E ) 。在 G = ( V , E ) 中,顶点数为 | V | ,边数为 | E |
连接两个顶点 u , v 记作 e = ( u , v ) 。在无向图中, ( u , v ) ( v , u ) 代表同一条边;在有向图中, ( u , v ) 的权记作 w ( u , v )
如果无向图中存在 ( u , v ) ,我们就称顶点 u v 相邻;相邻顶点的序列 v 0 , v 1 , . . . , v k (对于所有 i = 0 , 1 , . . . , k 存在边 ( v i 1 , v i ) 称为路径;起点和终点相同的路径称为环。
与顶点 u 相连的边数称为顶点 u 的度。在有向图中,以顶点 u 为终点的边数称为顶点 u 的入度,以顶点 u 为起点的边数称为顶点 u 的出度。

记住了这些繁杂的基本概念后,接下来我们来学习如何存储图。

存储

存储图,可使用邻接矩阵和邻接表。

(一)邻接矩阵

邻接矩阵作为最简单、最易实现、最简洁的存储图的方法,极易令人理解。
顾名思义,邻接矩阵就是使用二维数组来实现存储图的。数组的下标表示各个顶点的编号,所以,我们可以将数组下标为 ( u , v ) 的元素赋值为真,就可以表示从顶点u到顶点 v 有边。
代码实现如下(我没有调试hhh

bool a[M+5][M+5];//a是邻接矩阵存储表,只需bool数组即可,原因前面讲过
int n,m;//n记录顶点数,m记录边数
...
scanf("%d%d",&n);
for(int i=1;i<=m;i++)
{
    int u,v;
    scanf("%d %d",&u,&v);
    a[u][v]=1;
    a[v][u]=1;//这是无向图邻接矩阵存储,若是有向图,只需把这句话删掉
}

其实以上代码只是存储无向图的,但是我们只需稍稍对代码做一点变形,就可以实现对有向图、加权无向图、加权有向图的存储。
【未完待续】
补博客计划:图论系列文章:
1. 【未完】【板子图论】图论算法(二)——有向图的邻接矩阵与邻接表
2. 【未完】【板子图论】图论算法(三)——最短路径:Bellman-Ford算法与SPFA算法
3. 【未完】【板子图论】图论算法(四)——最短路径:Dijkstra算法与优先队列优化Dijkstra算法
4. 【未完】【板子图论】图论算法(五)——最短路径:Floyd-Warshall算法
5. 【未完】【板子图论】图论算法(六)——并查集
6. 【未完】【板子图论】图论算法(七)——最小生成树:Prim算法
7. 【未完】【板子图论】图论算法(八)——最小生成树:Kruskal算法

猜你喜欢

转载自blog.csdn.net/qq_37656398/article/details/78162917