Я написал код для реализации dfs на графике следующим образом:
#include<iostream>
#include<stack>
#include<stdbool.h>
#define MAX 10
using namespace std;
int vertex_id=0;
int graph_id=0;
class vertex{
public:
int id;
int visited;
int adj[MAX];
vertex();
};
vertex::vertex()
{
visited=0;
id=++vertex_id;
for(int i=1;i<MAX+1;i++)
{
adj[i]=0;
}
}
class graph:public vertex{
public:
stack<vertex> s;
int g_id;
vertex* adj_matrix[MAX+1][MAX+1]; //changed here
void dfs(vertex v);
void show_dfs(vertex v);
void add_edge(vertex v1,vertex v2);
graph();
};
graph::graph(){
g_id=graph_id++; //for multiple graphs
vertex_id=0;
for(int i=1;i<MAX+1;i++)
{
for(int j=1;j<MAX+1;j++)
{
adj_matrix[i][j]->id=-1; //changed here
}
}
}
void graph::add_edge(vertex v1,vertex v2){
v1.adj[v2.id]=1;
v2.adj[v1.id]=1;
adj_matrix[v1.id][v2.id]=&v2; //changed here
adj_matrix[v2.id][v1.id]=&v1; //changed here
}
void graph::dfs(vertex v){
s.push(v);
v.visited=1;
int counter=0;
for(int i=1;i<MAX+1;i++)
{
if(adj_matrix[v.id][i]->visited==0 && adj_matrix[v.id][i]->id!=-1) //changed here
{
adj_matrix[v.id][i]->visited=1; //changed here
counter=1; //successfully found adjacent unvisited vertex
vertex va=*adj_matrix[v.id][i]; //changed here
dfs(va);
return; //once dfs is excecuted, no breadth traversal should follow
}
}
if(!counter){
show_dfs(v);
cout<<endl;
return;
}
}
void graph::show_dfs(vertex v){
if(s.empty())
{
cout<<"No Paths Found ";
return;
}
while(!s.empty())
{
cout<<(s.top()).id<<"<---";
s.pop();
}
}
int main()
{
graph g;
vertex v1,v2,v3,v4,v5,v6,v7,v8,v9,v10;
g.add_edge(v1,v2);
g.add_edge(v1,v3);
g.add_edge(v1,v5);
g.add_edge(v3,v4);
g.add_edge(v3,v2);
g.add_edge(v2,v8);
g.add_edge(v8,v9);
g.add_edge(v9,v10);
g.add_edge(v5,v7);
g.add_edge(v5,v6);
g.add_edge(v6,v7);
g.dfs(v2);
//g.show_dfs(v2);
return 0;
}
Проблема с моим кодом заключается в том, что он компилируется без ошибок, но при запуске возвращает значение мусора. например, график, используемый здесь, производит следующий вывод: пример вывода
Я использовал указатели, чтобы предотвратить ненужное копирование вершин