- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <list>
// #include "BST.h"
using namespace std;
class Graph
{
int V; // Number of vertices
list<int> *adj; // Pointer to the array of adjacency list
public:
Graph(int V); // Constructor
void addEdge(int v, int w); // function to add an edge to the graph
void BFS(int s); // Prints the Breadth first Search for the graph from s.
};
//Defining the constructor
Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V];
}
// Function to add Edges to the vertice.
void Graph::addEdge(int v, int w)
{
adj[v].push_back(w); // Adding w to v's list
}
// Function to print out the Breadth First Search for the given graph starting at s.
void Graph::BFS(int s)
{
bool *visited = new bool[V];
cout << "Value of V: " << V << endl;
for(int i = 0; i < V; i++)
visited[i] = false;
// Create a queue for BFS
list<int> queue;
//Marking the starting node as visited and adding it to the queue.
visited[s] = true;
queue.push_back(s);
// Iterator to iterate over the adjacent list vertices
list<int>::iterator i;
while(!queue.empty())
{
// Printing the current vertex and removing it from the queue
s = queue.front();
cout << s << " ";
queue.pop_front();
// Going through the adjacency the list and adding it to the queue if it has not been visited.
for (i = adj[s].begin(); i != adj[s].end(); i++)
{
if(!visited[*i] )
{
visited[*i] = true;
queue.push_back(*i);
}
}
}
}
int main(int argc, char* argv[])
{
// If the user didn't provide a filename command line argument,
// print an error and exit.
if (argc != 3)
{
cout << "Usage: " << argv[0] << " <Filename> <starting node index>" << endl;
exit(1);
}
string line;
int size;
int starting_vertice;
char colon;
int vertex;
ifstream myfile (argv[1]);
if (myfile.is_open())
{
getline(myfile, line);
istringstream iss(line);
iss >> size;
// Initializing a graph of size taken in.
Graph g(size);
cout << "Vertex: " << "Connected Vertices" << endl;
for (int i = 0; i < size; i++)
{
getline(myfile, line);
istringstream iss(line);
iss >> starting_vertice;
iss >> colon;
while (iss >> vertex)
{
g.addEdge(starting_vertice, vertex);
}
cout << endl;
}
myfile.close();
cout << "Breadth First Search Starting at vertex " << argv[2] << " : " << endl;
// cout << atoi(argv[2]) << endl;
g.BFS( atoi(argv[2]) );
}
else
cout << "Unable to open file" << endl;
return 0;
}
这是我实现广度优先搜索特定输入文件的代码。输入文件如下:
4
1:2 3 4
2:4
3:4
4:
我知道我在遍历最后一个顶点的邻接列表时遇到段错误,但我无法解决这个问题。有帮助吗?
编辑:另外,我给出的起始节点索引是 1。
最佳答案
欢迎来到 off-by-one俱乐部。数组是零索引的。在 Graph
中,您创建一个大小为 V
的列表,然后通过 Graph::addEdge
,继续访问 V
-V
大小的数组 adj
的第一个元素。要解决此问题,您有两种选择 - 将顶点编号从 0
到 V-1
,或者将 adj
的大小增加到 V+1
。要执行后者:
Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V+1];
vvvvvv
}
关于c++ - BFS 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29384092/
我有一个无向图,我从中重新绘制了相同的图,但采用树状结构(具有层次)。我知道广度优先搜索 (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 #
我是一名优秀的程序员,十分优秀!