如何建立无向网的邻接矩阵(算法)?要知道这条边关联的顶点的下标

要用两个数组

图: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的数目,把若干条边的信息都保存在邻接矩阵中了

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C语言编写的程序,可构造无向图的邻接矩阵,并基于邻接矩阵存储的DBFS遍历算法进行遍历。程序代码如下: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最多顶点数 #define MAX_EDGE_NUM 100 // 最多边数 // 定义顶点结构体 typedef struct { int data; // 顶点数据 } VertexType; // 定义邻接矩阵存储结构体 typedef struct { int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int n, e; // 顶点数和边数 VertexType vexs[MAX_VERTEX_NUM]; // 存储顶点信息 } MGraph; // 初始化无向图 void CreateMGraph(MGraph *G) { int i, j, w; // i,j为顶点下标,w为权值 printf("请输入顶点数和边数:"); scanf("%d%d", &(G->n), &(G->e)); // 读入顶点数和边数 printf("请输入%d个顶点的数据:\n", G->n); for (i = 0; i < G->n; i++) { scanf("%d", &(G->vexs[i].data)); // 读入顶点信息 } for (i = 0; i < G->n; i++) { for (j = 0; j < G->n; j++) { G->edges[i][j] = 0; // 初始化邻接矩阵 } } printf("请输入%d条边的顶点序号和权值:\n", G->e); for (i = 0; i < G->e; i++) { int v1, v2; scanf("%d%d%d", &v1, &v2, &w); // 读入边的顶点序号和权值 G->edges[v1][v2] = w; G->edges[v2][v1] = w; // 无向图的邻接矩阵是对称矩阵 } } // 遍历顶点v的邻接点 void Visit(int v) { printf("%d ", v); } // 深度优先搜索 void DFS(MGraph G, int v, int visited[]) { int i; visited[v] = 1; // 标记顶点v为已访问 Visit(v); // 访问顶点v for (i = 0; i < G.n; i++) { if (G.edges[v][i] && !visited[i]) { // 如果v与i有边且i未访问 DFS(G, i, visited); // 递归访问i } } } // 基于邻接矩阵的深度优先遍历 void DFSTraverse(MGraph G) { int i; int visited[MAX_VERTEX_NUM]; // 记录顶点是否已访问 for (i = 0; i < G.n; i++) { visited[i] = 0; // 初始化所有顶点为未访问 } for (i = 0; i < G.n; i++) { if (!visited[i]) { // 如果顶点i未访问 DFS(G, i, visited); // 从顶点i开始深度优先遍历 } } } // 基于邻接矩阵的广度优先遍历 void BFSTraverse(MGraph G, int v) { int i, j; int visited[MAX_VERTEX_NUM]; // 记录顶点是否已访问 int queue[MAX_VERTEX_NUM]; // 用数组模拟队列 int front = 0, rear = 0; // 队列的头和尾指针 for (i = 0; i < G.n; i++) { visited[i] = 0; // 初始化所有顶点为未访问 } Visit(v); // 访问顶点v visited[v] = 1; // 标记顶点v为已访问 queue[rear++] = v; // 入队顶点v while (front < rear) { // 队列不为空 int k = queue[front++]; // 出队一个顶点 for (j = 0; j < G.n; j++) { if (G.edges[k][j] && !visited[j]) { // 如果k与j有边且j未访问 Visit(j); // 访问顶点j visited[j] = 1; // 标记顶点j为已访问 queue[rear++] = j; // 入队顶点j } } } } int main() { MGraph G; CreateMGraph(&G); printf("邻接矩阵为:\n"); int i, j; for (i = 0; i < G.n; i++) { for (j = 0; j < G.n; j++) { printf("%d ", G.edges[i][j]); } printf("\n"); } printf("深度优先遍历结果为:"); DFSTraverse(G); printf("\n"); printf("广度优先遍历结果为:"); BFSTraverse(G, 0); printf("\n"); return 0; } ``` 算法思想: 1. 根据用户输入的顶点数和边数,读入顶点信息和边的顶点序号和权值,构造出无向图的邻接矩阵存储结构体MGraph。 2. 基于邻接矩阵的深度优先遍历算法DFSTraverse,从每个未访问的顶点开始进行深度优先遍历,访问完所有与该顶点连通的顶点后,再返回该顶点的前一个未访问的邻接点,直到所有顶点都被访问完毕。 3. 基于邻接矩阵的广度优先遍历算法BFSTraverse,从指定的起始顶点开始,按照广度优先的顺序依次访问所有与该顶点相邻的未访问顶点,直到所有顶点都被访问完毕。在算法实现中,使用数组模拟队列,依次将每个已访问的顶点入队,出队时访问其邻接点,直到队列为空。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值