[英]Implementing graph and BFS in C++ using STL
以下是我寫的代碼。
#include <iostream>
#include <vector>
#include <list>
#include <queue>
using namespace std;
const int V=5;
vector<list<int> > a(V);
int BFS(int s)
{
int visited[V]={0};
queue<int> Q;
visited[s]=1;
Q.push(s);
while(!Q.empty())
{
int x=Q.front();
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);
}
visited[x]=2;
Q.pop();
iter++;
}
}
return 0;
}
void addEdge(int i, int j)
{
a[i].push_back(j);
a[j].push_back(i);
}
int main() {
vector<list<int> >::iterator it1=a.begin();
addEdge(0,1);
addEdge(0,2);
addEdge(2,1);
while(it1!=a.end())
{
list<int> it2=*it1;
list<int>::iterator iter=it2.begin();
while(iter!=it2.end())
{
cout<<*iter<<" ";
iter++;
}
cout<<endl;
it1++;
}
cout<<BFS(0);
return 0;
}
執行BFS(0)時,編譯器給出了運行時錯誤。 由於我對迭代器沒有太多經驗,我認為錯誤來自BFS函數中的迭代器語句。 請幫我解決代碼中的問題。
謝謝!
你的流行邏輯錯了。 它應該如下所示:
int BFS(int s)
{
int visited[V]={0};
queue<int> Q;
visited[s]=1;
Q.push(s);
while(!Q.empty())
{
int x=Q.front();
Q.pop(); // pop here. we have x now
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 0;
}
計算我留給你的最終價值,因為我想你想要的東西總是被歸還。 然而,這是你的問題的關鍵。
祝你好運。
我希望這段代碼會有所幫助
#include <iostream>
#include <list>
#include<queue>
using namespace std;
class Graph{
int nodes;
list<int>*adjMat;
bool *visited;
public:
Graph(int n){
this->nodes = n;
this->adjMat = new list<int>[n];
this->visited = new bool[n];
}
void addEdge(int u,int v){
this->adjMat[u].push_back(v);
}
void bfs(int n);
};
void Graph:: bfs(int n){
for(int i=0;i<this->nodes;i++)
visited[i]=false;
list<int>::iterator it;
queue<int>q;
q.push(n);
while (!q.empty()) {
int currentNode = q.front();
visited[currentNode] = true;
cout<<currentNode<<" ";
q.pop();
for(it=adjMat[currentNode].begin();it!=adjMat[currentNode].end();it++){
if(!visited[*it]){
q.push(*it);
}
}
}
}
int main(){
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.bfs(2);
}
使用我實現的STL的C ++中的BFS。我希望這段代碼會有所幫助。 謝謝。
#include <bits/stdc++.h>
using namespace std;
#define inf 1<<28
vector <int> G[100];
int dist[100];
int parent[100];
int distance[100];
bool visit[100];
void Display(queue <int> Q, int sz){
for(int i=0;i<sz;i++){
cout<< Q.front() << " " ;
Q.pop();
}
cout<< endl;
}
int BFS(int source, int destination){
queue <int> Q;
memset(dist,inf,sizeof dist);
Q.push(source);
dist[source] = 0;
visit[source] = true;
while(!Q.empty()){
int u = Q.front();
Q.pop();
for(size_t i=0;i<G[u].size();i++){
int v = G[u][i];
while(!visit[v]){
dist[v] = dist[u] + 1;
visit[v] = true;
parent[v] = u;
Q.push(v);
}
}
cout<< "Queue Operation : " << endl;
Display(Q,Q.size());
}
return dist[destination];
}
int main() {
int node,edge;
cin>>node>>edge;
for(int i=0;i<edge;i++){
int x,y;
cin>> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
cout<< endl;
int s,d;
cout<< "Source & Destination : " << endl;
cin>> s>> d;
cout<< "Distance : " << BFS(s,d) << endl;
cout<< "Path : " << endl;
while(d!=s){
cout<< d << " ";
d = parent[d];
}
return 0;
}
/*
10 13
1 2
1 4
1 3
2 6
4 7
3 7
3 8
6 10
7 9
8 7
8 5
9 10
5 10
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.