c++邻接表 DFS算法判定有向无环图不用vector
时间: 2023-07-25 17:13:53 浏览: 86
如果不使用`vector`,可以使用邻接表的数组表示法。具体实现如下:
```c++
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N], e[N], ne[N], idx;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
bool dfs(int cur, int* visited) {
visited[cur] = 1; // 当前节点状态设置为正在访问
for (int i = h[cur]; i != -1; i = ne[i]) {
int next = e[i];
if (visited[next] == 0) { // 邻接节点未访问,递归访问
if (!dfs(next, visited)) {
return false;
}
} else if (visited[next] == 1) { // 存在环,返回false
return false;
}
}
visited[cur] = 2; // 当前节点状态设置为已访问
return true;
}
bool isDAG(int n, int m, int* a, int* b) {
idx = 0;
memset(h, -1, sizeof h); // 初始化邻接表头节点为-1
for (int i = 0; i < m; i++) { // 添加边
add(a[i], b[i]);
}
int visited[n];
memset(visited, 0, sizeof visited); // 初始化所有节点状态为未访问
for (int i = 0; i < n; i++) { // 从任意一个未访问的节点开始遍历
if (visited[i] == 0) {
if (!dfs(i, visited)) {
return false;
}
}
}
return true;
}
int main() {
int n = 6, m = 7;
int a[7] = {0, 0, 1, 2, 3, 3, 4};
int b[7] = {1, 2, 3, 3, 4, 5, 5};
if (isDAG(n, m, a, b)) {
cout << "The graph is a DAG." << endl;
} else {
cout << "The graph is not a DAG." << endl;
}
return 0;
}
```
上面的代码中,`h`、`e`、`ne`、`idx`数组分别表示邻接表的头指针、节点、节点的下一个节点和当前节点的指针。`add`函数用于添加边。`dfs`函数和`isDAG`函数与上面的实现一样,只是使用了数组来代替`vector`。
阅读全文