booldfs(MGraph& G, int preVex, int curVex, vector<bool>& visited){ visited[curVex] = true; for (int i = 0; i < G.vertices.size(); ++i) { if (i == curVex) continue; if (visited[i] && G.edges[curVex][i] != 0 && i != preVex) { returnfalse; } if (!visited[i] && G.edges[curVex][i] != 0) { bool flag = dfs(G, curVex, i, visited); if (!flag) returnfalse; } } returntrue; }
boolisTree(MGraph& G){ int n = G.vertices.size(); vector<bool> visited(n, false); auto flag = dfs(G, -1, 0, visited); if (!flag) returnfalse; for (int i = 0; i < n; ++i) { if (!visited[i]) { returnfalse; } } returntrue; }
非递归深度优先搜索
题目描述
写出图的深度优先搜索 DFS 算法的非递归算法(图采用邻接表形式存储)。
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
voidnonRecursiveDFS(AlGraph& G, int startIdx){ vector<bool> visited(G.VNodes.size(), false); stack<int> s; s.emplace(startIdx); visited[startIdx] = true; while (!s.empty()) { int curIdx = s.top(); s.pop(); cout << G.VNodes[curIdx].vertex << " "; ArcNode* arc = G.VNodes[curIdx].first; while (arc != nullptr) { if (!visited[arc->verIdx]) { s.emplace(arc->verIdx); visited[arc->verIdx] = true; } arc = arc->next; } } }
判断是否存在一点到另一点的路径
题目描述
分别采用基于深度优先遍历和广度优先遍历算法判别以邻接表形式存储的有向图中是否存在由顶点 vi 到顶点 vj 的路径(i ≠ j)。注意,算法中涉及的图的基本操作必须在此存储结构上实现。
解题代码
DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
booldfs(AlGraph& G, int vi, int vj, vector<bool>& visited){ if (vi == vj) returntrue; visited[vi] = true; ArcNode* arc = G.VNodes[vi].first; while (arc != nullptr) { if (!visited[arc->verIdx] && dfs(G, arc->verIdx, vj, visited)) { returntrue; } arc = arc->next; } returnfalse; }
boolhasPathDFS(AlGraph& G, int vi, int vj){ vector<bool> visited(G.VNodes.size(), false); returndfs(G, vi, vj, visited); }