訪問したノードの数を返す無向の重み付けされていないグラフの隣接行列にBFSを実装しようとしています。私はこれまでこれを思いついたが、トップ/訪問したノードを印刷するとき、いくつかのノードが複数回発生し、ソートされていないため、これは正しくないと思います。 BFSはトポロジカルソートであり、取得した順序はソートされていないことをどこかで読みました。
int BFS(std::vector<std::vector<int> > &matrix, int start)
{
std::vector<bool> visited(matrix.size(), false);
std::queue<int> Q;
Q.Push(start);
int count = 0;
while( ! Q.empty())
{
int top = Q.front(); Q.pop();
visited[top] = true; count++;
for (int i = 0; i < matrix.size(); ++i)
{
if(matrix[top][i] != 0 && (! visited[i]) )
{
Q.Push(i);
}
}
}
return count;
}
キューをポップした後にvisited
ノードをtrueに設定する代わりに、キューに挿入するときにそれを設定し、一部のノードの二重カウントを防ぐために、内部にもカウントを追加する必要があります。以下を参照してください。
//..previous lines
Q.Push(start);
visited[start] = true;
int count = 1;
while(!Q.empty()){
int top = Q.front(); Q.pop();
for (int i = 0; i < matrix.size(); ++i){
if(matrix[top][i] != 0 && (! visited[i]) ){
Q.Push(i);
visited[i] = true;
count++;
}
}
}
答えを磨くのに役立ついくつかの質問があります。しかし、あなたが取り戻すカウントの詳細を共有してください。注目すべき点は次のとおりです。
std::vector<bool> visited(matrix.size(), false);
では、matrix.size()は外部ベクトルのサイズのみを返します。これは、最大で1行分のデータがVisitedで利用できることを意味します。