Как пройти через сеть подключенного узла подключенным способом?

У меня есть структура данных, которую можно визуализировать как подключенную сеть, такую ​​как эта:

Пример сети

Я полагаю (без доказательств), что должна быть возможность пройти все узлы, всегда перемещаясь от одного узла к связанному узлу (возврат, конечно, необходим и разрешен - как вы бы сделали с древовидной структурой). Как это сделать?

Структура данных может быть записана в псевдокоде как:

node[N] nodes; // the network as an array of N nodes

class node {
  List<pt_to_node> friend_nodes;  // a list of pointers to connected nodes
}

1 ответ

Вы можете просто реализовать график со стеком для поиска в глубину или в очередь для поиска в ширину

например Предположим, что мы собираемся начать с узла 1,

#include <vector>
#include <list>
#include <vector>
using namespace std;

class Graph
{
public:
    int vert; //number of vertices
    vector<list<int>> adj;

    Graph(int _v)
    {
        adj.resize(_v);
        vert = _v;
    }

    void addEdge(int v, int key)
    {
        adj[v].push_back(key);
        adj[key].push_back(v); // comment out if undirected
    }

    void bfs(int start);
    void dfs(int start);
};



void Graph::bfs(int start)
{

    vector<bool> visited(vert,false);

    list<int> queue;

    visited[start] = true; // visit the first node
    queue.push_back(start);


    while (!queue.empty())
    {
        start = queue.front();
        cout << start << " ";
        queue.pop_front();

        for (auto i = adj[start].begin(); i != adj[start].end(); ++i)
            if (!visited[*i])
            {
                visited[*i] = true;
                queue.push_back(*i);
            }
    }
    cout << endl;
}

void Graph::dfs(int start)
{
    vector<bool> visited(vert,false);

    vector<int> stack;

    visited[start] = true;
    stack.push_back(start);

    while (!stack.empty())
    {
        start = stack.back();
        cout << start << " ";
        stack.pop_back();

        for (auto i = adj[start].begin(); i != adj[start].end(); ++i)
            if (!visited[*i])
            {
                visited[*i] = true;
                stack.push_back(*i);
            }
    }
    cout << endl;
}

int main()
{

    Graph g(6); // number of vertices we need
    g.addEdge(1, 4);
    g.addEdge(4, 2);
    g.addEdge(4, 5);
    g.addEdge(2, 5);
    g.addEdge(5, 3);

    g.bfs(1); // start with 1
    g.dfs(1);


}

Результатами являются DFS: 1 4 2 5 3 и BFS 1 4 5 3 2. Однако в реальной сети каждое ребро имеет значение веса, которое означает расстояние или скорость ребра.

Другие вопросы по тегам