用c语言写求距离v0最短路径长度为k的所有顶点 功能:找出所有距离v0最短路径长度为k的顶点,并输出。输出语句为: printf("距离%s的最短路径为%d的顶点有%s",v0的值,k,顶点的值), 如果查询结果有多个,则补充打印printf(",%s",其他顶点); 提示:先声明一个一维数组,记录顶点的访问标志, 声明一个队列queue[][0]存储顶点的序号,queue[][1]存储当前顶点距离v0的路径长度, 遍历各顶点,然后输出queue[][1]是k的顶点。 参数:AdjGraph G 是需要操作的图,int v0是需要查找的参照点默认是v0(0),int k是距离v0最短路径的长度 返回值:无。 举例:查询结果是一个顶点:距离1的最短路径为3的顶点有4 查询结果是多个顶点:距离1的最短路径为3的顶点有5,3
时间: 2024-03-21 15:42:16 浏览: 127
以下是用C语言实现求距离v0最短路径长度为k的所有顶点的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTEX_NUM 20
typedef struct {
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
} AdjMatrix;
typedef struct {
int data[MAX_VERTEX_NUM];
int front, rear;
} Queue;
void InitQueue(Queue *Q) {
Q->front = Q->rear = -1;
}
int IsEmpty(Queue *Q) {
return Q->front == Q->rear;
}
void EnQueue(Queue *Q, int x) {
Q->rear++;
Q->data[Q->rear] = x;
}
int DeQueue(Queue *Q) {
Q->front++;
return Q->data[Q->front];
}
void BFS(AdjMatrix G, int v0, int k) {
int visited[MAX_VERTEX_NUM] = {0};
Queue Q;
int i, j, v, w, level;
InitQueue(&Q);
visited[v0] = 1;
EnQueue(&Q, v0);
level = 0;
while (!IsEmpty(&Q)) {
int n = Q.rear - Q.front;
level++;
for (i = 0; i < n; i++) {
v = DeQueue(&Q);
for (j = 0; j < G.vexnum; j++) {
if (G.arcs[v][j] != INT_MAX) {
w = G.arcs[v][j];
if (!visited[j]) {
visited[j] = 1;
EnQueue(&Q, j);
}
if (w + level == k) {
printf("距离%d的最短路径为%d的顶点有%d", v0, k, j);
while (!IsEmpty(&Q)) {
v = DeQueue(&Q);
if (G.arcs[v][j] != INT_MAX && visited[v]) {
printf(",%d", v);
}
}
printf("\n");
return;
}
}
}
}
}
printf("距离%d的最短路径为%d的顶点不存在\n", v0, k);
}
int main() {
AdjMatrix G;
int v0 = 0, k = 3;
int i, j;
// 初始化邻接矩阵
G.vexnum = 5;
G.arcnum = 7;
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) {
G.arcs[i][j] = INT_MAX;
}
}
// 添加边
G.arcs[0][1] = 2;
G.arcs[0][2] = 1;
G.arcs[1][2] = 3;
G.arcs[1][3] = 1;
G.arcs[2][3] = 2;
G.arcs[2][4] = 4;
G.arcs[3][4] = 3;
BFS(G, v0, k);
return 0;
}
```
这里我们使用了BFS算法来遍历图中所有顶点并查找距离v0最短路径长度为k的顶点。我们先初始化一个一维数组visited来记录顶点的访问标志,然后声明一个队列queue[][0]来存储顶点的序号,queue[][1]来存储当前顶点距离v0的路径长度。我们然后遍历各顶点,如果当前顶点距离v0的路径长度等于k,则输出该顶点,并遍历队列中的其他顶点,如果它们也能到达该顶点,则一起输出,最后返回。如果遍历完整个图都没有找到距离v0最短路径长度为k的顶点,则输出不存在。
注意:这里我们用INT_MAX来表示两个顶点之间不存在边,因为INT_MAX是一个足够大的数,可以保证在遍历过程中不会被误判为有效的路径长度。
阅读全文