前言
图,不是可以三言两语说得通的数据结构,比如树严格来说也是一种图,如果树中带环,就变成了图。
正文
如果不知道本节的重点,请先阅读标题。接下来我们直接开始。
首先,图你可以通俗的理解为几座城市,比如ABCD四座,A和B之间有城际公路,B和C有城际公路,D没有往外的城际公路,那么只要是个酱紫就知道A可以去B去C,B可以去A去C,C可以去A去B,D无处可去。在图中,我们把“城际高速”称为边,城市称作点或结点,而像D这样的城市叫“孤点”或“孤岛”。很通俗易懂,对吧?
然后是单向图与无向图,仍然通过举例来说明。
假设A点和B点连通,
但只能从A点去B点,这就是单向连通;
如果A点可以去B点,B点也可以去A点,这就是双向连通。
那么你可能会说,这样讲图不就是个数学模型嘛?编程上不是什么用也没有吗?那么我们现在引入两个概念,及出度and入度。你可以这么想,一个结点可以直接去到的结点的个数(不可以绕路)叫做出度,而可以直接去到该结点的结点个数(不可以绕路)叫做入度。
还是很简单的道理,有了以上概念,还是要进入代码环节。如何存储图呢?(提前预告一下,关于图的其他知识,比如图的搜索、洪水填充、完全图等知识会在下一节提到)
关于存储图的方法,可谓是群英集萃,目前作者已知的有4种,邻接矩阵、邻接点列表以及结构体数组和链式前向星。下文会分开赘述。
邻接矩阵
顾名思义,邻接矩阵就是把图的结点的连通关系保存在一个矩阵中。
优点很明显,就是可以很清楚地知道A点与B点是否连通。
但缺点也很多,比如空间的限制,假设我现在有10000个结点,a[10001][10001] 这么大的数组是开不出来的。
接下来演示邻接矩阵的存储方法。
#define MAXN 1008
bool a[MAXN][MAXN];
int n,m,nodex,nodey;
cin>>n>>m; // 有n个点,m个邻接关系
for(int i=1;i