【问题标题】:Implementing graph and BFS in C++ using STL使用 STL 在 C++ 中实现图形和 BFS
【发布时间】:2015-04-02 15:33:53
【问题描述】:

以下是我写的代码。

#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 函数中的迭代器语句。请帮我解决代码中的问题。

谢谢!

【问题讨论】:

  • 编译器不能(根据定义)给你一个运行时错误——你试过调试你的程序吗?
  • @MikeMB:对不起,我应该更具体一些。通过编译器,我的意思是我正在使用 CodeChef 的在线编译器。

标签: c++ graph stl breadth-first-search


【解决方案1】:

你的流行逻辑是错误的。它应该是这样的:

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;
}

我留给你的最终值的计算,因为我想你想要除了零之外的东西总是被返回。然而,这正是你问题的症结所在。

祝你好运。

【讨论】:

    【解决方案2】:

    我希望这段代码会有所帮助

    #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);
    
    
    }
    

    【讨论】:

      【解决方案3】:

      使用我已经实现的 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
      */
      

      【讨论】:

        猜你喜欢
        • 2014-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多