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

基本概念

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

概念

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

分类

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

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

术语

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

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

存储

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

(一)邻接矩阵

邻接矩阵作为最简单、最易实现、最简洁的存储图的方法,极易令人理解。
顾名思义,邻接矩阵就是使用二维数组来实现存储图的。数组的下标表示各个顶点的编号,所以,我们可以将数组下标为 (u,v) ( u , v ) 的元素赋值为真,就可以表示从顶点u到顶点 v v <script type="math/tex" id="MathJax-Element-27">v</script>有边。
代码实现如下(我没有调试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算法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值