对于图这个数据结构,最重要的操作就是遍历。常用的遍历方式就是DFS和BFS。总是记不住,今天做个总结。每个人的习惯不一样,我习惯DFS用递归实现,BFS用非递归实现。本文的模板也是针对这两种的(只写关键函数)
无论DFS还是BFS都要有一个访问数组,统计当前节点有没有访问过。本文设为visit。数组大小为节点数n。假设图已建好,名为graph(表示方式是C++中的vector<vector< int>>)
DFS
void DFS(int start) {
if (visit数组全部被访问)
return ;
visit[start] = 1;
for (int i=0; i<graph[start].size(); i++) {
if (!visit[graph[start][i]])
DFS(graph[start][i]);
}
return ;
}
BFS
void BFS(int start) {
vector<int> visit(n, 0);
queue<int> que;
visit[start] = 1;
que.push(start);
while (!que.empty()) {
int x = que.front();
que.pop();
for (int i=0; i<graph[x].size(); i++) {
if (!visit[graph[x][i]]) {
visit[graph[x][i]] = 1;
que.push(graph[x][i]);
}
}
}
}
写的比较简略,也没什么注释。不过想表达的意思表达出来了。