在邻接矩阵上应用广度和深度优先搜索?
Apply breadth and depth first search on an adjacency matrix?
我得到了这个邻接矩阵,我必须从文本文件中读取它,并且应该return读取它的广度优先和深度优先的结果。
我知道广度优先使用先进先出队列,深度优先使用后进先出堆栈。当我有图表时,我可以手动进行这些搜索。我只是不确定如何在计算机上处理这个问题,并在 C++ 上使用矩阵。
非常感谢有关如何解决此问题的指导。
我有一些问题:
- 我是否将文本文件中的矩阵作为常规矩阵保存到我的程序中?
- 阅读文本文件以显示搜索结果后该怎么办?
http://www.geeksforgeeks.org/breadth-first-traversal-for-a-graph/
最好的FS:
注意:对于无向图,扫描矩阵的上三角或下三角就足够了。
对于有向图,应考虑整个矩阵。
Step1:维护一个布尔值数组,用于保存节点是否被访问
第二步:实现一个队列
Step3:从任意元素开始,将其推入队列,并将其标记为已访问。
第4步:
在一个循环中
将队列中的顶部元素出队..让它成为 x
对于 x 的所有未访问邻居..将它们推入队列并将它们标记为已访问。
执行第 4 步,直到队列为空..
图的遍历顺序在元素入队时给出。
有空我会解释dfs
ANS 1: 是的,最好将文本文件中的输入读入正则矩阵。
void MyGraph::csv_import()
{
int temp, i=0;
string parsed;
fstream file("input.csv");
while (getline(file, parsed, ',')) {
temp = stoi(parsed);
arr[i/10][i%10] = temp; //10 x 10 Matrix
i++;
}
}
ANS 2: Select一个起始节点,调用BFS显示搜索结果。例如(在我的例子中)
void MyGraph::BFS(int v)
{
memset(visited, false, sizeof(visited);
QQ.push(v); //push the starting vertex into queue
visited[v] = true; //mark the starting vertex visited
while (!QQ.empty()) //until queue is not empty
{
v = QQ.front(); //assign v the vertex on front of queue
cout << v << " "; //print the vertex to be popped
QQ.pop(); //pop the vertex on front
for (int c = 0; c< V; c++) //V is the number of nodes
{
//M[i][j] == 1, when i,j are connected
if (M[v][c] == 1 && visited[c] == false)
{ //if vertex has edge and is unvisited
QQ.push(c); //push to the queue
visited[c] = true; //mark it visited
Path[c] = p; //assign the path length
}
}
}
}
我得到了这个邻接矩阵,我必须从文本文件中读取它,并且应该return读取它的广度优先和深度优先的结果。
我知道广度优先使用先进先出队列,深度优先使用后进先出堆栈。当我有图表时,我可以手动进行这些搜索。我只是不确定如何在计算机上处理这个问题,并在 C++ 上使用矩阵。
非常感谢有关如何解决此问题的指导。 我有一些问题:
- 我是否将文本文件中的矩阵作为常规矩阵保存到我的程序中?
- 阅读文本文件以显示搜索结果后该怎么办?
http://www.geeksforgeeks.org/breadth-first-traversal-for-a-graph/
最好的FS: 注意:对于无向图,扫描矩阵的上三角或下三角就足够了。 对于有向图,应考虑整个矩阵。
Step1:维护一个布尔值数组,用于保存节点是否被访问
第二步:实现一个队列
Step3:从任意元素开始,将其推入队列,并将其标记为已访问。 第4步: 在一个循环中 将队列中的顶部元素出队..让它成为 x
对于 x 的所有未访问邻居..将它们推入队列并将它们标记为已访问。
执行第 4 步,直到队列为空..
图的遍历顺序在元素入队时给出。
有空我会解释dfs
ANS 1: 是的,最好将文本文件中的输入读入正则矩阵。
void MyGraph::csv_import()
{
int temp, i=0;
string parsed;
fstream file("input.csv");
while (getline(file, parsed, ',')) {
temp = stoi(parsed);
arr[i/10][i%10] = temp; //10 x 10 Matrix
i++;
}
}
ANS 2: Select一个起始节点,调用BFS显示搜索结果。例如(在我的例子中)
void MyGraph::BFS(int v)
{
memset(visited, false, sizeof(visited);
QQ.push(v); //push the starting vertex into queue
visited[v] = true; //mark the starting vertex visited
while (!QQ.empty()) //until queue is not empty
{
v = QQ.front(); //assign v the vertex on front of queue
cout << v << " "; //print the vertex to be popped
QQ.pop(); //pop the vertex on front
for (int c = 0; c< V; c++) //V is the number of nodes
{
//M[i][j] == 1, when i,j are connected
if (M[v][c] == 1 && visited[c] == false)
{ //if vertex has edge and is unvisited
QQ.push(c); //push to the queue
visited[c] = true; //mark it visited
Path[c] = p; //assign the path length
}
}
}
}