📚 参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
🍋 邻接矩阵表示的补充
🚗 无论是无向图还是有向图的邻接矩阵表示,主对角线都是0,理由:顶点本身无法连接;
🚗 无向图的邻接矩阵
表示图是对称矩阵;如下图1;
🚗 邻接矩阵表示无向图的优点在于:
🚲 LocateVex(G,V)定位函数判断图中任意两个顶点是否邻接,寻找顶点的邻接点,求顶点的度等操作易于实现,算法简单、直观,易于理解;
🚲 对于无向图,计算任意顶点的度,对应的行(列)的非零个数;
🚲 对于有向图,对应行的非零元个数是出度,对应列的非零元个数是入度;
如下图1中:V1的度为2,V2的度为1,V3的度为2,V4的度为1;
如下图2中:V1的出度为2,入度为1;V2的出度为0,入度为1;V3的出度为1,入度为1,V4的出度为1,入度为1;
🚗 无向图、有向图的邻接矩阵表示和无向网、有向网的邻接矩阵表示区别在于是否有权值,如下:
🔗 相关代码:
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFINITY INT_MAX //最大值
#define MAX_VERTEX_NUM 20 //最大顶点数
typedef int Status;
typedef int VertexType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
} MGraph;
Status LocateVex(MGraph G,VertexType v);
//定位v在邻接矩阵中的位置
Status LocateVex(MGraph G,VertexType v) {
int i;
for(i=0; i<G.vexnum; i++) {
if(G.vexs[i]==v) return i;
}
return -1;
}
Status CreateDGraph(MGraph &G);
//构造邻接矩阵表示的有向图DG
Status CreateDGraph(MGraph &G) {
printf("请输入当前顶点数和弧数(空格隔开):");
scanf("%d %d",&G.vexnum,&G.arcnum);
int i,j,k;
int v1,v2,w; //弧尾和弧头及权值
for(i=0; i<G.vexnum; i++) {
printf("请输入第%d个的顶点信息:",i+1);
scanf("%d",&G.vexs[i]);
}
printf("\n");
for(i=0; i<G.vexnum; i++) //初始化邻接矩阵
for(j=0; j<G.vexnum; j++) {
G.arcs[i][j]={INFINITY};
}
for(k=0; k<G.arcnum; k++) {
printf("请输入第%d条边的起点序号和终点序号(空格隔开):",k+1);
scanf("%d %d",&v1,&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i==-1 || j==-1) return ERROR;
else{
G.arcs[i][j]=1;
}
}
return OK;
}
Status PrintDGraph(MGraph G);
//打印图
Status PrintDGraph(MGraph G) {
int i,j;
printf("\n有向图的顶点为:\n");
for(i=0; i<G.vexnum; i++)
printf("V%d ",G.vexs[i]);
printf("\n有向图的邻接矩阵为:\n");
printf("\t");
for(i=0; i<G.vexnum; ++i)
printf("%8d", G.vexs[i]);
putchar('\n');
for(i=0; i<G.vexnum; ++i) {
printf("\n%8d", G.vexs[i]);
for(j=0; j<G.vexnum; ++j) {
if(G.arcs[i][j] == INT_MAX) printf("%8s", "0");
else printf("%8d",G.arcs[i][j]);
}
printf("\n");
}
return OK;
}
Status InDegree(MGraph G);
//求有向图各顶点的入度
Status InDegree(MGraph G){
int i,j,into;
for(i=0; i<G.vexnum; i++){
into=0;
for(j=0; j<G.vexnum; j++){
if(G.arcs[j][i] != INT_MAX) {
into++;
}
}
if(into == 0) printf("\n顶点V%d没有入度\n",G.vexs[i]);
else printf("\n顶点V%d的入度为:%d\n",G.vexs[i],into);
}
}
Status OutDegree(MGraph G);
//求有向图各顶点的出度
Status OutDegree(MGraph G) {
int i,j, out;
for(i=0; i<G.vexnum; i++) {
out=0; //初始为0
for(j=0; j<G.vexnum; j++) {
if(G.arcs[i][j] != INT_MAX) {
out++;
}
}
if(out==0) printf("\n顶点V%d没有出度\n",G.vexs[i]);
else printf("\n顶点V%d的出度为:%d\n",G.vexs[i],out);
}
}
Status Degree(MGraph G);
//求有向图各顶点的度
Status Degree(MGraph G) {
int i,j,deg;
for(i=0; i<G.vexnum; i++){
deg=0;
for(j=0; j<G.vexnum; j++){
if(G.arcs[i][j]!=INT_MAX || G.arcs[j][i]!=INT_MAX)
deg++;
}
if(deg==0) printf("\n顶点V%d没有度\n",G.vexs[i]);
else printf("\n顶点V%d的度为:%d\n",G.vexs[i],deg);
}
}
int main(void) {
MGraph G;
CreateDGraph(G);
PrintDGraph(G);
putchar('\n');
OutDegree(G);
putchar('\n');
InDegree(G);
putchar('\n');
Degree(G);
return 0;
}
🌔 实现: