图形中有多少节点可访问
how many nodes in graph are reachable?
我想打印可从特定节点访问的节点数。我读取了图形并存储在邻接列表中并执行了bfs.我尝试了以下 code.it 适用于某些图形.你能找出这个问题吗?
#include <vector>
#include <iostream>
#include <list>
#include<queue>
using namespace std;
int BFS(int s)
{
const int V=100;
int r=0;
vector<list<int> > a(V);
int visited[V]={0};
queue<int> Q;
visited[s]=1;
Q.push(s);
++r;
while(!Q.empty())
{
int x=Q.front();
Q.pop(); // pop here. we have x now
++r;
vector<list<int> >::iterator it1=a.begin()+x;
list<int> it2=*it1;
list<int>::iterator iter=it2.begin();
while(iter!=it2.end())
{
if(visited[*iter]==0)
{
visited[*iter]=1;
Q.push(*iter);
}
++iter;
}
visited[x]=2; // set visited here.
}
return r;
}
void printAsGrid(int V)
{
// Create a local 2D projection grid
int size = V.size();
double *grid = new double[size*size];
memset(grid, 0.0, size*size*sizeof(double));
// Get the edge connection and weight
int index;
for (index = 0; index < size; index++) {
list<Edge>::const_iterator eit;
for (eit = V[index].edges.begin();
eit != V[index].edges.end(); eit++) {
int to = (*eit).to;
double w = (*eit).weight;
// record weight in the projection grid
grid[(index*size)+to] = w;
}
}
// print header
out << " |";
for (index = 0; index < size; index++)
out << " " << index;
out << endl;
out << "---+";
for (index = 0; index < size; index++)
out << "-----";
out << endl;
// print content
out.setf(ios::fixed);
out.setf(ios::showpoint);
for (index = 0; index < size; index++) {
out << " " << index << " |";
for (int j = 0; j < size; ++j)
out << setw(5) << setprecision(1) << grid[(index*size)+j];
out << endl;
}
// delete grid before exit
delete [] grid;
}
int main()
{
int s;
int V,total_neighbors, id, weight;
//number of vertices
cout<<"enter the no.of vertices:";
cin>>V;
vector< list< int > > graph(V + 1);
for(int i= 0; i<V;i++) {
cout<<"Enter no.of neighbours of"<<i<<":";
cin>>total_neighbors;
cout<<"Enter the neighbours of"<<i<<":";
for(int j = 0; j <total_neighbors; j++) {
cin>>id;
graph[i].push_back(id);
}
}
vector<list<int> >::iterator i;
int c=0;
for (vector<std::list<int> >::iterator i=graph.begin(); i !=graph.end(); ++i){
cout<<"vertices connected to node "<<c <<" are ";
//cout<<*i;
std::list<int> li = *i;
for(std::list<int>::iterator iter = li.begin(); iter!= li.end(); ++iter){
cout<<*iter<<" ";
}
cout<<endl;
c++;
}
int f;
cin>>f;
s=BFS(f);
cout<<s<<" ";
return 0;
}
adjacencyList 0 -> 1 -> 2
adjacencyList 1 -> 2 -> 4
adjacencyList 2 -> 4
adjacencyList 3 -> 5
adjacencyList 4
adjacencyList 5 -> 3
返回 2,但实际答案是 3
你正在做两次 r++。只有在推送节点或只是弹出节点时才能执行此操作。否则,对于源节点,它将计数两次。同时将 r 初始化为 0。还要手动初始化访问过的阵列以确保安全。
你也拿了vector<list<int> >::iterator it1=a.begin()+x;
而 a 是空的。 vector<list<int> > a(V);
只是初始化列表的向量,但不在其中放置值。因此,您尝试遍历的列表是空的。你得到 2 是因为你做了两次 r++ .一个在插入源时,另一个在删除源时,这给你 2.
请参阅此代码:
#include <vector>
#include <iostream>
#include <list>
#include<queue>
using namespace std;
int BFS(vector<list<int> > graph, int s)
{
const int V=100;
int r=0;
int visited[V]={0};
for(int i = 0; i < V; i++) visited[i] = 0;
queue<int> Q;
visited[s]=1;
Q.push(s);
while(!Q.empty())
{
int x=Q.front();
cout << x << endl;
Q.pop(); // pop here. we have x now
++r;
vector<list<int> >::iterator it1=graph.begin()+x;
list<int> it2=*it1;
list<int>::iterator iter=it2.begin();
while(iter!=it2.end())
{
if(visited[*iter]==0)
{
visited[*iter]=1;
Q.push(*iter);
}
++iter;
}
visited[x]=2; // set visited here.
}
return r;
}
int main()
{
int s;
int V,total_neighbors, id, weight;
//number of vertices
cout<<"enter the no.of vertices:";
cin>>V;
vector< list< int > > graph(V + 1);
for(int i= 0; i<V;i++) {
cout<<"Enter no.of neighbours of"<<i<<":";
cin>>total_neighbors;
cout<<"Enter the neighbours of"<<i<<":";
for(int j = 0; j <total_neighbors; j++) {
cin>>id;
graph[i].push_back(id);
}
}
vector<list<int> >::iterator i;
int c=0;
for (vector<std::list<int> >::iterator i=graph.begin(); i !=graph.end(); ++i){
cout<<"vertices connected to node "<<c <<" are ";
//cout<<*i;
std::list<int> li = *i;
for(std::list<int>::iterator iter = li.begin(); iter!= li.end(); ++iter){
cout<<*iter<<" ";
}
cout<<endl;
c++;
}
int f;
cin>>f;
s=BFS(graph,f);
cout<<s<<" ";
return 0;
}
相关文章:
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 类成员函数无法访问同一类的私有结构节点?
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 尝试从单向链表C++中删除单个节点时出现读取访问冲突
- 有没有办法访问C++ Boost rtree 中的非叶节点
- C++:无法访问节点值
- 如何访问链式哈希表链表中的每个节点
- 从链表数组访问节点数据
- 使用访问者设计模式在N- ARY树中重复访问子节点值
- 如何在OMNet++中访问我的模拟的不同节点
- 在节点插件中访问 inspector_agent.h
- 链接列表节点的访问违规:C
- Dijkstra首个节点访问了
- 在图算法中,确定是否访问节点的最佳方法是什么?
- 如何在 <Target> MsBuild 中访问节点外部的项目元数据?
- 递归函数插入二叉搜索树无法按根访问节点
- Assimp访问节点名称时出错
- 访问节点矢量