要用两个数组
图:AMGraph
一维数组vexs存储顶点信息,元顶点素类型这里是字符,所以定义为字符型char
数组中有多少个元素呢?取决于图中有多少个顶点。我们可以假设100
所以,我们定义这样一个一维数组,最多有100个元素,每个元素都是一个顶点,这就是顶点表
我们还需要二维数组存储这个邻接矩阵,它也是边,就用这个数组arcs【MVNum】【MVNum】,
有多少行多少列仍然取决于顶点的个数
数组中的元素类型是什么呢?是这个边的类型ArcType,我们可以假设这个边的值是整型,你也可以根据需要自己设置float等(不是网,图的话,不带权值,0和1也是整型;如果是网,就是无穷大和权值,总之他是一个整数)
我们还需要额外的一些值,比如当前的数组定义成这么大,但是这个数组有可能没有全用
我们可以自己定义顶点数自己用起来方便些,vexnum表示顶点数,arcnum表示总共有多少条边,他们的类型是整型。
如果是网,两个顶点之间没有边或弧,我们表示为无穷大,我们就可以用一个很大的数,权值不可能超过这么多,那我们就定义这个最大的整数,用他来表示无穷大
这就是邻接矩阵表示法,我们定义的存储结构:一个一维数组,一个二维数组,还有两个整数(分别表示图中的顶点数和边数),接下来的算法是把数组建起来
这里我们用无向网作为例子,看他的邻接矩阵怎么建立。
首先输入多少个顶点和多少个边,即为这两个变量vexnum和arcnum赋值,他们两个定了之后,顶点的一维数组的元素,邻接矩阵中每一个元素的值输入,的循环就定了
然后,我们依次输入顶点信息到顶点表中,我们先建立顶点表数组vexs[i]
邻接矩阵分两步,先初始化,用双重循环,把每一个元素的值都设定为极大值MaxInt,
然后构造邻接矩阵,有边的地方,设置他的权值,没边的地方,保留原来的无穷大
UDN:无向网,首先有这样的邻接矩阵表示的图的类型,叫做G:AMGraph &G
G有4个成员:顶点表,边表,顶点数目,边的数目
怎么操作这4个成员?G不是指针,所以我们用成员引用符.来引用,&G的&表示通过G带回返回值
第一步,先输入顶点数和边数存储好
第二步,建立顶点表vexs,即给一维数组赋值,有几个顶点呢?i从0到G.vexnum-1这个循环执行这么多次
第三步,建立邻接矩阵,分两步走,先初始:给邻接矩阵中所有的元素赋一个无穷大MaxInt
怎么赋呢?邻接矩阵是一个二维数组,所以我们需要一个双重循环,一行一行的来,总共有多少行呢?有多少个顶点就有多少行,每一行有多少个元素呢?有多少个顶点就有多少个元素
接下来,构造邻接矩阵:输入边的情况
这条边依附于哪两个顶点?这条边的权值是多少?所以,我们输入两个顶点和权值
接下来,给这个邻接矩阵中这个元素G.arcs[i][j]的值,赋值为权
顶点在顶底表中的下标是几呢?
查找,确定后,然后才能为元素赋值
所以我们用这个查找顶点,他的结果是得到我们当前输入的顶点在顶点表中的位置,即下标
具体怎么求呢?算法LocateVex(找输入顶点的下标):
给我一个邻接矩阵G,然后我在里面查找顶点u
怎么找?
就是在顶点表中看哪一个元素和我们当前的要查找的顶点一样,一个一个来看,从下标为0一直到n-1
如果一样u==G.vexs[i],我们就返回他的下标i;没有我们就返回-1
这条边依附于这两个顶点,他们的下标是多少,分别找出来,然后给邻接矩阵中这个下标值赋值为w
无向网和无向图是一样的,都是对称矩阵,我们把对称元素的值G.arcs[j][i]设置为和刚才与元素的值G.arcs[i][j]一样,或者直接写w
然后再反复下一个:
我们输入了若干条边,每一条边我们都找出来,这条边是针对哪两个顶点的
然后我们修改邻接矩阵中对应的元素值就好了,我们通过这个循环,循环次数取决于边G.arcnum的数目,把若干条边的信息都保存在邻接矩阵中了