求图的邻接顶点
问题描述:已知图G用邻接矩阵存储,设计算法以分别实现函数firstadj(G,v)和nextadj(G,v,w)。
【算法设计思想】
firstadj(G,V )函数:
- 遍历顶点
v
的所有可能邻接顶点(即矩阵G[v][j]
的所有列)。 - 对于每一个顶点
j
,检查G[v][j]
是否不等于0
(表示v
和j
之间有边)。 - 如果找到这样的顶点
j
,则返回j
。 - 如果遍历完所有顶点都没有找到,则返回
-1
。
nextadj( G,V,W)函数:
- 遍历顶点
v
的所有可能邻接顶点,从w + 1
开始(即矩阵G[v][j]
的所有列,从w + 1
开始)。 - 对于每一个顶点
j
,检查G[v][j]
是否不等于0
(表示v
和j
之间有边)。 - 如果找到这样的顶点
j
,则返回j
。 - 如果遍历完所有顶点都没有找到,则返回
-1
。
【算法描述】
// 寻找顶点v的第一个邻接顶点
int firstadj(int G[N][N], int v) {
for (int j = 0; j < N; j++) {
if (G[v][j] != 0) {
return j;
}
}
return -1;
}
// 在顶点v的所有邻接顶点中,寻找顶点w的下一个邻接顶点
int nextadj(int G[N][N], int v, int w) {
for (int j = w + 1; j < N; j++) {
if (G[v][j] != 0) {
return j;
}
}
return -1;
}
【完整的测试程序】
#include <stdio.h>
#define N 5 // 假设图中有N个顶点
// 函数声明
int firstadj(int G[N][N], int v);
int nextadj(int G[N][N], int v, int w);
int main() {
// 示例邻接矩阵,可以表示无向图或有向图
int G[N][N] = {
{0, 1, 0, 0, 1},
{1, 0, 1, 1, 0},
{0, 1, 0, 1, 0},
{0, 1, 1, 0, 1},
{1, 0, 0, 1, 0}
};
// 遍历图中每个顶点的邻接顶点
for (int v = 0; v < N; v++) {
printf("Vertex %d: ", v);
// 寻找顶点v的第一个邻接顶点
int adj = firstadj(G, v);
if (adj != -1) {
printf("%d ", adj);
// 循环寻找顶点v的所有其他邻接顶点
while ((adj = nextadj(G, v, adj)) != -1) {
printf("%d ", adj);
}
}
printf("\n");
}
return 0;
}
// 寻找顶点v的第一个邻接顶点
int firstadj(int G[N][N], int v) {
for (int j = 0; j < N; j++) {
if (G[v][j] != 0) {
return j;
}
}
return -1;
}
// 在顶点v的所有邻接顶点中,寻找顶点w的下一个邻接顶点
int nextadj(int G[N][N], int v, int w) {
for (int j = w + 1; j < N; j++) {
if (G[v][j] != 0) {
return j;
}
}
return -1;
}
标签:return,int,邻接,firstadj,顶点,求图,数据结构,adj
From: https://www.cnblogs.com/zeta186012/p/18199494