- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用邻接矩阵学习 BFS(广度优先搜索)。
我尝试过的:
目标:
邻接矩阵的图类:
#include <iostream>
#include <queue>
using namespace std;
class Graph {
private:
bool** adjMatrix;
int numVertices;
bool* visited;
public:
//constructor
Graph(int numVertices) {
this->numVertices = numVertices;
adjMatrix = new bool*[numVertices];
for(int i = 0; i < numVertices; i++) {
adjMatrix[i] = new bool[numVertices];
for(int j = 0; j < numVertices; j++)
adjMatrix[i][j] = false;
}
visited[numVertices]; //init visited array
}
//member function
void BFS(int sp) {
//make a queue of type int
queue<int> Q;
//make bool visited array & mark all positions unvisited
for(int i = 0; i < numVertices; i++)
visited[i] = false;
//push sp into queue
Q.push(sp);
//mark sp as visited
visited[sp] = true;
//while queue isn't empty
while(!Q.empty()) {
//make temp node
int temp = Q.front();
//pop temp node
Q.pop();
//use loop & check if it has children
int rows = sizeof adjMatrix / sizeof adjMatrix[0]; //get row size
for(int i = 0; i < rows; i++) { //check neighboring nodes
if(!visited[i] && adjMatrix[sp][i] == true) {
Q.push(i); //if so push them into queue
visited[i] = true; //mark children as visited
}
}
}
}
};
最佳答案
好的,因为您没有附上错误日志或测试用例输出,请考虑以下实现
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <cstdlib>
// using namespace std; Don't do this. Good CPP production code uses separate namespaces
const int BUFFER_CLEAR_VALUE = 999;
class Graph {
private:
std::vector<std::vector<bool> > adj_mat;
public:
//constructor
Graph() {
std::cout << "Enter vertex num" << std::endl;
int num_vertices;
std::cin >> num_vertices;
while (std::cin.fail()) {
std::cout << "Enter a valid num" << std::endl;
std::cin.clear();
std::cin.ignore(BUFFER_CLEAR_VALUE, '\n');
std::cin >> num_vertices;
}
for (int i = 0; i < num_vertices; i++) {
std::vector<bool> temp;
temp.resize(num_vertices);
adj_mat.push_back(temp);
}
}
// member fn
void initialize() {
for (int i = 0; i < adj_mat.size(); i++) {
for (int j = 0; j < adj_mat[0].size(); j++) {
char choice;
do {
std::cout << "Enter adj mat value for [y/n] " << i << ":" << j << std::endl;
std::cin >> choice;
if (choice == 'y') {
adj_mat[i][j] = true;
} else {
adj_mat[i][j] = false;
}
if (std::cin.fail() || (choice!='y' && choice!='n' )) {
std::cout << "enter a valid value please!!" << std::endl;
std::cin.clear();
std::cin.ignore(BUFFER_CLEAR_VALUE,'\n');
}
} while( std::cin.fail() || (choice!='y' && choice!='n' ));
}
}
}
// member fn
void showMatrix() {
std::cout << std::endl << "Adjacency Matrix" << std::endl;
for (int i = 0; i < adj_mat.size(); i ++) {
for (int j = 0; j < adj_mat[i].size(); j++) {
std::cout << adj_mat[i][j] << "\t";
}
std::cout << std::endl;
}
}
// member fn
void breadthFirstSearch(int start_point, int end_point) {
std::queue<int> vertex_queue;
std::set<int> visited_vertices;
vertex_queue.push(start_point);
while(!vertex_queue.empty()) {
// Get next vertex
int current_vertex = vertex_queue.front();
vertex_queue.pop();
// Make note of current visit
visited_vertices.insert(current_vertex);
std::cout << "Looking at " << current_vertex << std::endl;
for (int j = 0; j < adj_mat[current_vertex].size(); j++) {
if (adj_mat[current_vertex][j]) {
if (j == end_point) {
std::cout << "Found it " << j << std::endl;
return;
} else if (!(visited_vertices.find(j) != visited_vertices.end())) {
vertex_queue.push(j);
}
}
}
}
std::cout << "Could not find it!" << std::endl;
}
};
int main() {
Graph g;
g.initialize();
g.showMatrix();
g.breadthFirstSearch(0, 1);
g.breadthFirstSearch(0, 4);
return 0;
}
几点
vector
等来为您处理诸如内存之类的东西呢? (如果这不是您想要的,您没有说明)false
。您是否打算在某个时候更改此设置?using namespace std;
main
中提供了一个非常基本的测试用例运行我上面共享的代码以获得这样的图表
$ ./Adjacency
Enter vertex num
5
Enter adj mat value for [y/n] 0:0
y
Enter adj mat value for [y/n] 0:1
y
Enter adj mat value for [y/n] 0:2
n
Enter adj mat value for [y/n] 0:3
n
Enter adj mat value for [y/n] 0:4
n
Enter adj mat value for [y/n] 1:0
y
Enter adj mat value for [y/n] 1:1
y
Enter adj mat value for [y/n] 1:2
y
Enter adj mat value for [y/n] 1:3
y
Enter adj mat value for [y/n] 1:4
n
Enter adj mat value for [y/n] 2:0
n
Enter adj mat value for [y/n] 2:1
y
Enter adj mat value for [y/n] 2:2
y
Enter adj mat value for [y/n] 2:3
n
Enter adj mat value for [y/n] 2:4
n
Enter adj mat value for [y/n] 3:0
n
Enter adj mat value for [y/n] 3:1
y
Enter adj mat value for [y/n] 3:2
n
Enter adj mat value for [y/n] 3:3
y
Enter adj mat value for [y/n] 3:4
n
Enter adj mat value for [y/n] 4:0
n
Enter adj mat value for [y/n] 4:1
n
Enter adj mat value for [y/n] 4:2
n
Enter adj mat value for [y/n] 4:3
n
Enter adj mat value for [y/n] 4:4
y
Adjacency Matrix
1 1 0 0 0
1 1 1 1 0
0 1 1 0 0
0 1 0 1 0
0 0 0 0 1
Looking at 0
Found it 1
Looking at 0
Looking at 1
Looking at 2
Looking at 3
Could not find it!
建议的可能改进
Graph
是神类cin
东西的干净方法.size()
调用。关于c++ - BFS(广度优先搜索)邻接矩阵C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52192421/
我有一个无向图,我从中重新绘制了相同的图,但采用树状结构(具有层次)。我知道广度优先搜索 (BFS) 算法的工作原理,但我不确定如何从图 --> 树进行转换。 在这里,在 this Wikipedia
只要我没记错,UCS 和 BFS 是一样的,唯一的区别是它不是扩展最浅的节点,而是扩展路径成本最低的节点。 (也为此使用 PriorityQueue 而不是 Queue)所以我复制了我的 BFS 代码
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我正在寻找一个代码来找到有向图中的最短路径 a 。 有什么地方可以找到吗? (可以基于BFS) 最佳答案 使用Erlang Digraph Library和函数 get_short_path/3,它采
这个问题已经有答案了: What is the point of the diamond operator (<>) in Java? (7 个回答) 已关闭 6 年前。 我是java初学者,我有BF
我想修改下面的代码以动态从文件中获取数据并运行 BFS。我尝试过循环,但我坚持如何使用匿名对象动态连接节点。 Node nA=new Node("101"); Node nB=new
我正在尝试实现 BFS 来查找学习某门类(class)之前所需的所有先决条件。我的public List computeAllPrereqs(String courseName)方法是我的代码困惑的地
我正在尝试编写一个程序来查找节点 B 是否属于从节点 A 开始的子树。我用 C 编写了代码,并自行实现了队列机制,因为我使用 BFS 来遍历树。问题是我的代码遇到无限循环,说我的队列已满,甚至没有。
我已经制作了 BFS 算法的并行版本,现在我正在尝试序列化相同的算法以了解加速情况。我的代码是这样的: #include #include #include struct Node {
我尝试根据我的研究在 JAVA 中实现 BFS 算法,但我有点困惑,我不确定我是在检查节点是否是目标,还是在将节点添加到探索列表中适当的地方。代码如下: frontier.add(nodes.getF
请帮助我理解我的代码做错了什么。我试图使用 BFS 获得最短路径来解决问题,但它要么给我 -1 要么 2。它应该给我 6 作为答案。我究竟做错了什么?这就是问题所在: 给定一个棋盘,找到马从给定来源到
我最近在解决一个 bfs 问题,其中每个节点都是数组元素的不同排列。但是我无法想出一个合适的数据结构来跟踪扩展树中的访问节点。通常,节点是不同的字符串,因此我们可以只使用映射将节点标记为已访问,但在上
我有一个文件夹结构中的元素列表: /文件夹/myfile.pdf /folder/subfolder1/myfile.pdf /文件夹/子文件夹2/myfile.pdf /folder/subfold
我已经实现了一个 BFS 算法来检测图中的循环,这是以下代码: void hasCycle(node *root,string start){ if(
真的很难弄清楚如何修复我的代码。我知道显然存在错误,因为它没有运行,但我不确定错误到底是什么,也不确定如何修复它们。任何帮助/见解将不胜感激。谢谢!! struct vertices { in
我在图中有代表城镇的顶点。我试图找到从 A 点到 B 点的最短路径。 我创建了一个图形类。 struct Edge{ string name; vector v; Edge(
所以我正在构建这棵树,它有 1..* 个节点,其中每个节点都有一个列表,该列表本身可以有 1..* 个节点。 树的前三层我可以构建得很好,但如果我不编写所有愚蠢的级别,它就不会发挥更多作用。解决方案当
我正在研究 Perfect Squares - LeetCode Perfect Squares Given a positive integer n, find the least number o
我是图论新手,目前只学过图论中的BFS和Disjoint sets。如果在给定的无向连通图中存在一个循环,我可以使用 BFS 找到它吗?我的意图是打印循环中的所有顶点。提前致谢。 最佳答案 是的,如果
我在矩阵上实现 bfs 时遇到问题。似乎我的代码只检查起始节点的子节点。 我的目标是找到从“B”到“H”的最短路径。我还认为我的代码需要大量修改。先感谢您! #include #include #
我是一名优秀的程序员,十分优秀!