深度优先搜索
辅助空间定义
vector<bool> marked(G.numV); // 是否已经访问
vector<int> edgeTo(G.numV); // 前驱顶点,便于回溯
深度优先搜索递归算法
void DFS(Graph &G, int v) {
marked[v] = true;
for (auto w : G.adj[v]) {
if (!marked[w]) {
DFS(G, w);
edgeTo[w] = v;
}
}
}
在有向图中也是同理
void DFS(DiGraph &G, int v) {
marked[v] = true;
for (auto w : G.adj[v]) {
if (!marked[w]) {
DFS(G, w);
}
}
}
广度优先搜索
void DFS(DiGraph &G, int v) {
marked[v] = true;
for (auto w : G.adj[v]) {
if (!marked[w]) {
DFS(G, w);
edgeTo[w] = v;
}
}
}
辅助空间定义
vector<bool> marked(G.numV); // 是否已经访问
vector<int> edgeTo(G.numV); // 前驱结点,便于回溯
vector<int> distTo(G.numV, 0); // 路径长度
广度优先搜索非递归算法(借助队列)
void BFS(Graph &G, int s) {
marked[s] = true;
queue<int> q;
q.push(s);
while (!q.empty()) {
int v = q.front();
q.pop();
for (auto w : G.adj[v]) {
if (!marked[w]) {
q.push(w);
marked[w] = true;
edgeTo[w] = v;
distTo[w] = distTo[v] + 1;
}
}
}
}
在有向图中也是同理
void BFS(DiGraph &G, int s) {
marked[s] = true;
queue<int> q;
q.push(s);
while (!q.empty()) {
int v = q.front();
q.pop();
for (auto w : G.adj[v]) {
if (!marked[w]) {
q.push(w);
marked[w] = true;
}
}
}
}
搜索算法的应用与挑战
问题 | BFS | DFS | 时间复杂度 |
---|---|---|---|
可达 | ✅ | ✅ | $E+V$ |
最短路径 | ✅ | $E+V$ | |
连通分量 | ✅ | ✅ | $E+V$ |
重连通分量 | ✅ | $E+V$ | |
环 | ✅ | ✅ | $E+V$ |
欧拉回路 | ✅ | $E+V$ | |
哈密尔顿回路 | |||
二部图 | ✅ | ✅ | $E+V$ |
平面图 | ✅ | $E+V$ | |
图同构 |