BFS를 C++로 구현하려고했는데 함수는 다음과 같이 작동해야합니다. 그래프로 &을 매개 변수로 가져온 다음 두 벡터를 만들고 그 중 하나는 매개 변수 정점에 인접한 정점을 저장하는 데 사용됩니다. 그 중 하나가 방문되지 않은 경우 인접성을 가져 와서 벡터에 추가 한 다음 정점을 VISITED로 표시하고 인쇄해야합니다. 나는이 코드를 썼지 만 어떤 것도 출력했다. 참고 : 다른 함수가 그래프와 같은 데이터 구조 &이 작동하고, 문제가 BFS 함수에 있음을 확인했습니다. 여러분 중 일부가 문제를 해결하는 데 도움이되기를 바랍니다.폭 넓은 검색을 구현하는 방법은 무엇입니까?
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
enum Mark {VISITED, UNVISITED};
struct Vertex {
char name;
Mark mark;
};
struct Edge{
Vertex v1;
Vertex v2;
Edge(Vertex vertex1, Vertex vertex2): v1(vertex1), v2(vertex2){};
};
struct Graph{
vector<Vertex>vertices;
vector<Edge>edges;
vector<pair<Vertex, Edge>> adjacent(char u){
vector<pair<Vertex, Edge>>res;
for(Edge e : edges){
if(e.v1.name == u){
res.push_back(make_pair(e.v2, e));
}else if(e.v2.name == u){
res.push_back(make_pair(e.v1, e));
}
}
return res;
}
vector<Vertex> getAdj(char u){
vector<Vertex>result;
for(Edge e: edges){
if(e.v1.name == u){
result.push_back(e.v2);
}else if(e.v2.name == u){
result.push_back(e.v1);
}
}
return result;
}
};
void BFS(Graph g, Vertex u){
vector<Vertex>vec = g.getAdj(u.name);
for(Vertex v : vec){
if(v.mark == UNVISITED){
vector<Vertex>q = g.getAdj(v.name);
for(int i=0; i<q.size(); i++){
vec.push_back(q[i]);
}
v.mark = VISITED;
vec.pop_back();
cout << v.name << " ";
}
}
}
int main(int argc, const char * argv[]) {
Graph g;
Vertex v1, v2, v3, v4, v5, v6;
v1.name = 'A';
v2.name = 'B';
v3.name = 'C';
v4.name = 'D';
v5.name = 'E';
v6.name = 'Z';
g.edges.push_back(Edge(v1, v2));
g.edges.push_back(Edge(v1, v3));
g.edges.push_back(Edge(v2, v3));
g.edges.push_back(Edge(v2, v4));
g.edges.push_back(Edge(v3, v4));
g.edges.push_back(Edge(v3, v5));
g.edges.push_back(Edge(v4, v5));
g.edges.push_back(Edge(v4, v6));
g.edges.push_back(Edge(v5, v6));
BFS(g, v1);
cout << endl;
}
답변을 주셔서 감사합니다. 출력물을 만드는데 도움이되었지만 여전히 bfs 알고리즘에 문제가 있습니다. – Salma
출력이 무엇인지 알고 계십니까? – ShadowMitia
@Salma 내 대답을 업데이트했습니다 – ShadowMitia