目录
算法逻辑可能并不严谨,欢迎各位大佬批评指正!
一、非递归实现深度优先遍历
1、算法思想
(1)算法思想:
- 首先检查起始顶点的索引是否有效和图是否已经建立。
- 使用栈来实现深度优先搜索,首先将起始顶点入栈,并将起始顶点标记为已访问。
- 循环直到栈为空,每次取出栈顶顶点,打印并访问它的邻接顶点,并将未访问的邻接顶点入栈并标记为已访问。
(2)时间复杂度: O(V + E)
(3)空间复杂度: O(V),其中V是顶点数,E是边数。
2、算法流程图
3、算法
//深度优先
void DFS(int start) {
if (start < 0 || start >= numVertices) {
cout << "起始顶点不在图形中" << endl;
return;
}
if (checkGraphBuilt()) {
vector<bool> visited(numVertices, false);
stack<int> s;
s.push(start);
visited[start] = true;
while (!s.empty()) {
int current = s.top();
s.pop();
if (current < 0 || current >= numVertices) {
continue;
}
printNode(current);
for (auto node : adjList[current]) {
if (!visited[node.dest]) {
s.push(node.dest);
visited[node.dest] = true;
}
}
}
cout << endl;
}
}
二、广度优先遍历
1、算法思想
(1)算法思想:
- 首先检查起始顶点的索引是否有效和图是否已经建立。
- 使用队列来实现广度优先搜索,首先将起始顶点入队,并将起始顶点标记为已访问。
- 循环直到队列为空,每次取出队首顶点,打印并访问它的邻接顶点,并将未访问的邻接顶点入队并标记为已访问。
(2)时间复杂度: O(V + E)
(3)空间复杂度: O(V),其中V是顶点数,E是边数。
2、算法流程图
3、算法
//广度优先
void BFS(int start) {
if (start < 0 || start >= numVertices) {
cout << "起始顶点不在图形中" << endl;
return;
}
if (checkGraphBuilt()) {
vector<bool> visited(numVertices, false);
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int current = q.front();
q.pop();
if (current < 0 || current >= numVertices) {
continue;
}
printNode(current);
for (auto node : adjList[current]) {
if (!visited[node.dest]) {
q.push(node.dest);
visited[node.dest] = true;
}
}
}
cout << endl;
}
}
三、附检测算法完整程序(含无向图、有向图的构造)
1、操作说明
-
根据菜单指示输入要进行的操作相应的数字
-
输入数字1将会输出已经构造好的无向网。
-
输入数字2将进入键盘输入有向图的操作,输入顶点个数(规定顶点是从0开始的数字,如:顶点个数为4,则顶点分别是0、1、2、3),输入边的起点和终点。
-
输入数字3输出有