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的在线编译器。