//深度优先搜索遍历连通图的递归算法 #includeusing namespace std; #define MVNum 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vexs[MVNum]; // 顶点表 ArcType arcs[MVNum][MVNum]; // 邻接矩阵 int vexnum, arcnum; }Graph; bool visited[MVNum]; // 访问标志数组 int FirstAdjVex(Graph G, int v); // 返回v的第一个邻接点 int NextAdjVex(Graph G, int v, int w); // 返回v相对于w的下一个邻接点 int LocateVex(Graph G, VerTexType v) { for (int i = 0; i < G.vexnum; i++) { if (G.vexs[i] == v) { return i; } return -1; } } void CreateUDN(Graph& G) { cout << "请输入总顶点数,总边数:"; cin >> G.vexnum >> G.arcnum; cout << endl; cout << "请输入点的名称" << endl; for (int i = 0; i < G.vexnum; i++) { cout << "请输入第" << i + 1 << "个点的名称:"; cin >> G.vexs[i]; } for (int i = 0; i < G.vexnum; i++) { for (int j = 0; j < G.vexnum; j++) { G.arcs[i][j] = 0; } } cout << "输入边依附的顶点" << endl; for (int k = 0; k < G.arcnum; k++) { VerTexType v1, v2; cout << "请输入第" << k + 1 << "条边依附的顶点:"; cin >> v1 >> v2; int i = LocateVex(G, v1); int j = LocateVex(G, v2); G.arcs[j][i] = G.arcs[i][j] = 1; } } void DFS(Graph G, int v) { cout << G.vexs[v] << " "; visited[v] = true; for (int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) { if (!visited[w]) { DFS(G, w); } } } int FirstAdjVex(Graph G, int v) { for (int i = 0; i < G.vexnum; i++) { if (G.arcs[v][i] == 1 && visited[i] == false) { return i; } } return -1; } int NextAdjVex(Graph G, int v, int w) { for (int i = w; i < G.vexnum; i++) { if (G.arcs[v][i] == 1 && visited[i] == false) { return i; } } return -1; } int main() { cout << "DFS遍历连通图的递归算法" << endl; Graph G; CreateUDN(G); cout << "请输入遍历连通图的起始点:"; VerTexType c; cin >> c; int i; for(i = 0; i < G.vexnum; i++) { if (c == G.vexs[i]) { break; } } while (i >= G.vexnum) { cout << "该点不存在,请重新输入! " << endl; cout << "请输入遍历连通图的起始点:" << endl; cin >> c; for (i = 0; i < G.vexnum; i++) { if (c == G.vexs[i]) { break; } } } cout << "深度优先搜索遍历连通图的结果:" << endl; DFS(G, i); cout << endl; return 0; }



