问题:假设图用邻接表表示,设计一个算法,输出从顶点u到v的简单路径。
算法思想:这个算法使用深度优先搜索(DFS)的思想来查找从顶点u到顶点v的路径。其基本思想如下:
- 初始化路径长度d为0,并将起始顶点u添加到路径path中。
- 将顶点u标记为已访问。
- 如果顶点u等于目标顶点v,则表示找到了一条从顶点u到顶点v的路径,输出路径path。
- 遍历顶点u的所有邻居w:如果邻居w未被访问过,则递归调用findPath函数,在顶点w处继续查找路径。
- 将顶点u标记为未访问,以便在回溯时恢复状态。
通过不断地递归调用findPath函数,可以深度优先地遍历图中的顶点,并在每次递归时更新路径和访问状态,以找到从起始顶点u到目标顶点v的所有路径。
这个算法的关键在于深度优先搜索的递归过程,通过递归不断地探索未访问过的邻居顶点,直到找到目标顶点v或无法继续搜索为止。在搜索过程中,通过路径数组和访问数组来记录和管理路径和顶点的访问状态。
代码
#include <iostream>
#include <cstring>
const int MAX_PATH_LENGTH = 100;
const int MAX_VERTICES = 10;
struct ARCNODE {
int adjvex;
ARCNODE* nextarc;
};
struct VertexNode {
ARCNODE* firstarc;
};
struct Graph {
VertexNode adjlist[MAX_VERTICES];
};
int visited[MAX_VERTICES];
void printPath(int path[], int length) {
for (int i = 0; i <= length; i++) {
std::cout << path[i] << " ";
}
std::cout << std::endl;
}
void findPath(Graph* g, int u, int v, int path[], int d) {
int w;
ARCNODE* p;
d++;
path[d] = u;
visited[u] = 1;
if (u == v) {
printPath(path, d);
}
p = g->adjlist[u].firstarc;
while (p != NULL) {
w = p->adjvex;
if (visited[w] == 0) {
findPath(g, w, v, path, d);
}
p = p->nextarc;
}
visited[u] = 0;
}
Graph* createGraph() {
Graph* g = new Graph();
// 初始化邻接表
for (int i = 0; i < MAX_VERTICES; i++) {
g->adjlist[i].firstarc = NULL;
}
// 添加边
g->adjlist[0].firstarc = new ARCNODE();
g->adjlist[0].firstarc->adjvex = 1;
g->adjlist[0].firstarc->nextarc = NULL;
g->adjlist[1].firstarc = new ARCNODE();
g->adjlist[1].firstarc->adjvex = 2;
g->adjlist[1].firstarc->nextarc = NULL;
g->adjlist[2].firstarc = new ARCNODE();
g->adjlist[2].firstarc->adjvex = 3;
g->adjlist[2].firstarc->nextarc = NULL;
g->adjlist[3].firstarc = NULL;
return g;
}
int main() {
Graph* graph = createGraph();
int u = 2; // 起始顶点
int v = 3; // 目标顶点
int path[MAX_PATH_LENGTH];
int d = -1;
memset(visited, 0, sizeof(visited));
findPath(graph, u, v, path, d);
delete graph;
return 0;
}
#include <iostream>
#include <cstring>
const int MAX_PATH_LENGTH = 100;
const int MAX_VERTICES = 10;
struct ARCNODE {
int adjvex;
ARCNODE* nextarc;
};
struct VertexNode {
ARCNODE* firstarc;
};
struct Graph {
VertexNode adjlist[MAX_VERTICES];
};
int visited[MAX_VERTICES];
void printPath(int path[], int length) {
for (int i = 0; i <= length; i++) {
std::cout << path[i] << " ";
}
std::cout << std::endl;
}
int firstneighbor(Graph* g, int v) {
if (g->adjlist[v].firstarc != NULL) {
return g->adjlist[v].firstarc->adjvex;
}
return -1;
}
int nextneighbor(Graph* g, int v, int w) {
ARCNODE* p = g->adjlist[v].firstarc;
while (p != NULL) {
if (p->adjvex == w && p->nextarc != NULL) {
return p->nextarc->adjvex;
}
p = p->nextarc;
}
return -1;
}
void findPath(Graph* g, int u, int v, int path[], int d) {
int w;
d++;
path[d] = u;
visited[u] = 1;
if (u == v) {
printPath(path, d);
}
for (w = firstneighbor(g, u); w >= 0; w = nextneighbor(g, u, w)) {
if (visited[w] == 0) {
findPath(g, w, v, path, d);
}
}
visited[u] = 0;
}
Graph* createGraph() {
Graph* g = new Graph();
// 初始化邻接表
for (int i = 0; i < MAX_VERTICES; i++) {
g->adjlist[i].firstarc = NULL;
}
// 添加边
g->adjlist[0].firstarc = new ARCNODE();
g->adjlist[0].firstarc->adjvex = 1;
g->adjlist[0].firstarc->nextarc = NULL;
g->adjlist[1].firstarc = new ARCNODE();
g->adjlist[1].firstarc->adjvex = 2;
g->adjlist[1].firstarc->nextarc = NULL;
g->adjlist[2].firstarc = new ARCNODE();
g->adjlist[2].firstarc->adjvex = 3;
g->adjlist[2].firstarc->nextarc = NULL;
g->adjlist[3].firstarc = NULL;
return g;
}
int main() {
Graph* graph = createGraph();
int u = 1; // 起始顶点
int v = 3; // 目标顶点
int path[MAX_PATH_LENGTH];
int d = -1;
memset(visited, 0, sizeof(visited));
findPath(graph, u, v, path, d);
delete graph;
return 0;
}