int shortpathlen(AdjGraph *G,int u,int v) { ArcNode *p; SqQueue *qu; InitQueue(qu); int visited[MAXV]; for(int i=0;i<G->n;i++){ visited[i]=0; } int dist[MAXV]; for(int i=0;i<G->n;i++) { dist[i]=-1; } dist[u]=0; visited[u]=1; enQueue(qu,u); while(!QueueEmpty(qu)) { int u; deQueue(qu,&u); p=G->adjlist[u].firstarc; while(p!=NULL) { int w=p->adjvex; if(visited[w]==0) { dist[w]=dist[u]+1; visited[w]=1; enQueue(qu,w); } p=p->nextarc; } } if(dist[v]==-1){ printf("不存在从%d到%d的路径\n",u,v); return -1; }else{ printf("从%d到%d的最短路径长度为:%d\n",u,v,dist[v]); return dist[v]; } }修改上述程序,使之满足用BFS求从u到v的最短路径,需要修改队列的元素类型,每个元素记录下它的前驱结点(parent指针指示),而不是用dist记录长度的方式实现
时间: 2024-01-23 14:02:53 浏览: 58
修改后的程序如下:
```c
typedef struct {
int vertex; // 顶点
int parent; // 前驱结点
} QElemType;
int shortpathlen(AdjGraph *G, int u, int v) {
ArcNode *p;
SqQueue *qu;
InitQueue(qu);
int visited[MAXV];
for (int i = 0; i < G->n; i++) {
visited[i] = 0;
}
QElemType elem;
elem.vertex = u;
elem.parent = -1;
visited[u] = 1;
enQueue(qu, elem);
while (!QueueEmpty(qu)) {
deQueue(qu, &elem);
if (elem.vertex == v) {
while (!QueueEmpty(qu)) { // 清空队列
deQueue(qu, &elem);
}
break;
}
p = G->adjlist[elem.vertex].firstarc;
while (p != NULL) {
int w = p->adjvex;
if (visited[w] == 0) {
visited[w] = 1;
QElemType new_elem;
new_elem.vertex = w;
new_elem.parent = elem.vertex;
enQueue(qu, new_elem);
}
p = p->nextarc;
}
}
if (elem.vertex != v) {
printf("不存在从%d到%d的路径\n", u, v);
return -1;
} else {
int len = 0;
while (elem.parent != -1) {
len++;
elem = getQueueElem(qu, elem.parent);
}
printf("从%d到%d的最短路径长度为:%d\n", u, v, len);
return len;
}
}
```
修改的主要部分是队列元素类型的定义和入队操作。新的队列元素类型 `QElemType` 包含一个顶点和一个前驱结点,表示在 BFS 搜索中该顶点的前驱结点是哪个。入队操作时,要将顶点和前驱结点一起保存在队列中。在搜索过程中,如果找到了目标顶点,就可以根据队列中保存的前驱结点逆向追溯路径,计算出最短路径的长度。
阅读全文