//代码示意如下:
typedef char VerterType; /*顶点类型*/
typedef int EdgType; /*边上的类型*/
/*图的邻接矩阵存储结构*/
typedef struct graph0
{
VerterType vexs[MAX];/*顶点表*/
EdgType arc[MAX][MAX];/*邻接矩阵*/
int numVertexes; /*图中当前的顶点数*/
int numEdges; /*图中当前的边数*/
}graph0;
(一)无向图
(1)这里0代表v0-v0之间没有相连。
(2)因为是无向图,所以是对称矩阵。
(3)根据顶点数建立一个矩阵,例如有n个顶点,则建立一个n*n的矩阵。
(4)顶点数组保存的是顶点的信息。
性质:1.可以判断两顶点是否有边无边就非常容易了(1有,0没有)。
2.我们要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行(或第i列)的元素之和。比如上图顶点v1的度就是1+0+1+0=2
3.求顶点vi的所有邻接点就是将矩阵第i行元素扫描一遍,arc[i][j]为1就是邻接点
(二)有向图
注意:其中顶点数组是一样的和无向图,弧数组也是一个矩阵,但因为是有向图,所以这个矩阵并不对称:例如v1->v0有弧,arc[1][0]=1,而v0到v1没有弧,所以arc[0][1]=0。
另外有向图,要考虑入度和出度,顶点v1的入度为1,正好是第v1列的各数之和,顶点v1的出度为2,正好是第v2行的各数之和
(三)网(每条边上带有权的图就叫做网,例如两个顶点之间的距离)
注意:(拿上面的图来说明‘∞’的意思,例如v1-v0之间是有边的,权值为9,但是v0-v1是没有边的,用‘∞’来表示,0则表示本身到本身是没有边的。
//代码测试
/*无向图的邻接矩阵创建*/
void CreateGraph(graph0* g)
{
int i=0, j=0, k=0;
int w = 0;
printf("请输入顶点数和边数:\n");
scanf_s("%d,%d", &g->numVertexes, &g->numEdges,4);
getchar(); //获取回车符
for (i = 0; i < g->numVertexes; i++)
{
scanf_s("%c", &g->vexs[i],5);
}
getchar(); //获取回车符
for (i = 0; i < g->numVertexes; i++)
{
for (j = 0; j < g->numVertexes; j++)
{
g->arc[i][j] = 0;//初始化为0,即所有顶点一开始不连接
}
}
for (k = 0; k < g->numEdges; k++)
{
printf("输入边<vi,vj>上的下标i,下标j和w的值:\n");
scanf_s("%d,%d,%d", &i,&j,&w,4);
getchar(); //获取回车符
g->arc[i][j] = w; //这里w为1代表两个顶点相连,为0则无连接
g->arc[j][i] = g->arc[i][j];//无向图的数组是一个对称矩阵
}
}
int main(void)
{
graph0 gra;
CreateGraph(&gra);
system("pause");
return 0;
}
所以,我们通过边数和顶点数,还有顶点数组和边数组的值就可以画出图形的结构。
即:5个顶点6条边。