文章概述:
刚开始图论我们先不急于解决实际的问题,先去搞明白如何存储图的信息。实际上我们早就接触过类似的内容,比如上一篇文章的开灯关灯游戏中,我们使用一维数组来表示一排灯的状态,但是如果要表示更加复杂的内容怎么办呢?比如我们在地图上知道几座城市之间的交通路线图,明白城市与城市之间是不是联通的,如果联通的话,具体路程是多少的信息该如何储存就是我们这篇的目的。
思路概述:
和开灯游戏一样,我们可以使用数组的下标来表示不同的城市比如arr[5][5],表示有5座城市,arr[1][2]表示城市1到城市2的路程,arr[2][1],表示城市2到城市1的路程,根据具体问题不同可以将图分为有向图和无向图。
无向图解释起来就是假设有两块地区,为地区a和地区b,二者之间建立了一条双向通道,这样的话a到b和b到a的路程长度一样,arr[a][b] == arr[b][a],所以无向图的矩阵都是关于主对角线对称的。
有向图就是a,b二者之间的道路是两道单向道路,或者只有一条单向道路。这时候从a到b和从b到a的路程就不一样了。
无论是有向图还是无向图,我们都要让arr[x][x]=0,因为从x城市到x城市的路程为0,所以矩阵的主对角线都为0.
如果一所城市到另一所城市没有通路,例如a到b没有通路,那么我们可以给arr[a][b]赋值为负数或者正无穷(一个极大的数字)来表示。
具体图解:
总结来看无向图矩阵主对角线元素为0,矩阵关于主对角线对称。
有向图矩阵主对角线元素为0,一般不关于主对角线对称。
课后习题:
题目描述
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的 T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入输出格式
输入格式
第一行是两个整数 N,M,N 表示成都的大街上有几个路口,标号为 1 的路口是商店所在地,标号为 N 的路口是赛场所在地,M 则表示在成都有几条路。
接下来 M 行,每行包括三个整数 A,B,C,表示在路口 A 与路口 B 之间有一条路,我们的工作人员需要 C 分钟的时间走过这条路。
输入保证至少存在 1 条商店到赛场的路线。
输出格式
输出一行,表示工作人员从商店走到赛场的最短时间。
输入输出样例1
输入
3 3
1 2 5
2 3 5
3 1 2
输出
2
输入输出样例2
输入
2 1
1 2 3
输出
3
在此大家只要能使用图的邻接矩阵表示法将图表示出来,本文的目的便已经达成了,关于这道题的具体做法也不难,大家可以使用我们先前讲过的深度优先搜索来解决,之后我会带来更多的图论算法。