在标准BFS实现中,节点可以是三种颜色中的一种,以表示它是未被发现,被发现但是不完整,还是被发现和完成。有没有办法只使用两种颜色而不是三种颜色来实现BFS?
答案 0 :(得分:1)
是的,您只能用两种颜色来表示它。实际上,在99%的问题中,你不需要第三种颜色。你需要得到一个答案:节点X是否在队列中? 要回答这个问题,我们需要一个数组。假设我们称该数组已被访问。
此数组可以包含的值为0或1。
访问[X] = 1,如果节点X在队列中(节点X正在等待处理)或节点在队列中(这意味着节点X当前正在处理,或者已经处理完毕,我们就完成了与该节点) 如果节点X尚未进入队列
,则访问[X] = 0这是一段代码:
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
using namespace std;
const int N = 10003;
char visited[N];
queue<int> q;
vector<int> ls[N];
int main() {
int n, m; scanf("%d%d", &n, &m); // number of vertices and number of edges
for(int i = 0; i < m; ++i) {
int x, y; scanf("%d%d", &x, &y);
ls[x].push_back(y);
ls[y].push_back(x);
}
int num_of_components = 0;
for(int i = 1; i <= n; ++i) // iterating through all nodes
if(!visited[i]) { // if we didn't visit node i , then this is a new component
visited[i] = '1'; // mark node as visited
q.push(i); // push node to queue
++num_of_components; // new component was found, so add one
while(!q.empty()) {
int x = q.front();
q.pop();
int sz = ls[x].size();
for(int j = 0; j < sz; ++j) {
int y = ls[x][j];
if(!visited[y]) {
visited[y] = '1';
q.push(y);
}
}
}
}
printf("%d\n", num_of_components);
return 0;
}