C++ 在C+中实现图形和BFS+;使用STL

C++ 在C+中实现图形和BFS+;使用STL,c++,graph,stl,breadth-first-search,C++,Graph,Stl,Breadth First Search,下面是我编写的代码 #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;

下面是我编写的代码

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
常数int V=5;
载体a(V);
int BFS(int s)
{
int访问[V]={0};
队列Q;
访问量=1;
Q.推送;
而(!Q.empty())
{
int x=Q.front();
向量::迭代器it1=a.begin()+x;
列出it2=*it1;
列表::迭代器iter=it2.begin();
while(iter!=it2.end())
{
如果(访问[*iter]==0)
{
参观[*iter]=1;
Q.push(*iter);
}
访问量[x]=2;
Q.pop();
iter++;
}
}
返回0;
}
无效补遗(整数i,整数j)
{
a[i]。推回(j);
a[j].推回(i);
}
int main(){
向量::迭代器it1=a.begin();
增补(0,1);
增补(0,2);
增编(2,1);
while(it1!=a.end())
{
列出it2=*it1;
列表::迭代器iter=it2.begin();
while(iter!=it2.end())
{

cout您的pop逻辑是错误的。它应该如下所示:

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;
}
intBFS(intS)
{
int访问[V]={0};
队列Q;
访问量=1;
Q.推送;
而(!Q.empty())
{
int x=Q.front();
Q.pop();//这里是pop。我们现在有x了
向量::迭代器it1=a.begin()+x;
列出it2=*it1;
列表::迭代器iter=it2.begin();
while(iter!=it2.end())
{
如果(访问[*iter]==0)
{
参观[*iter]=1;
Q.push(*iter);
}
++iter;
}
已访问[x]=2;//在此处设置已访问。
}
返回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);


}
#包括
#包括
#包括
使用名称空间std;
类图{
int节点;
列表*adjMat;
布尔*访问;
公众:
图(int n){
这个->节点=n;
此->adjMat=新列表[n];
此->已访问=新布尔[n];
}
无效补遗(整数u,整数v){
此->调整[u]。向后推(v);
}
无效bfs(int n);
};
void图::bfs(int n){
for(int i=0;索引节点;i++)
访问[i]=错误;
列表::迭代器;
queueq;
q、 推(n);
而(!q.empty()){
int currentNode=q.front();
已访问[currentNode]=真;

在C++中使用了我所实现的STL,希望能对大家有帮助。谢谢。
#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
*/
#包括
使用名称空间std;

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