Как создать неориентированный граф из матрицы смежности?

#c #matrix

#c #матрица

Вопрос:

Привет, везде есть объяснение по горячим чертежам, как создать график из adj. matrix. Однако для этого мне нужен простой псевдокод или алгоритм…. Я знаю, как вывести его из adj. matrix и не знаю, почему никто нигде не объясняет, как на самом деле поместить это в код. Я имею в виду не фактический код, а хотя бы алгоритм… Многие говорят .. 1 — это если есть ребро, я знаю, что .. Я создал adj. matrix и не знаю, как перенести его в график. У моих вершин нет имен, они просто индексы матрицы. например, 1-9 — это «имена моей матрицы»

   1 2 3 4 5 6 7 8 9
1 0 1 0 0 1 0 0 0 0
2 1 0 1 0 0 0 0 0 0
3 0 1 0 1 0 0 0 0 0
4 0 0 1 0 0 1 0 0 0
5 1 0 0 0 0 0 1 0 0
6 0 0 0 1 0 0 0 0 1
7 0 0 0 0 1 0 0 1 0
8 0 0 0 0 0 0 1 0 0
9 0 0 0 0 0 1 0 0 0
  

изначально это был лабиринт… нужно пометить строку 1 col4 как начало, а строку 7 col8 как конец…

Никто никогда не говорил мне, как реализовать график из матрицы (без пера): Pp

Спасибо

Комментарии:

1. Матрица смежности — это способ представления графика. Вы имеете в виду, что хотите преобразовать в другое представление? И если да, то как бы вы хотели представить граф?

Ответ №1:

Природа симметрии

Матрица смежности — это представление графика. Для неориентированного графа его матрица симметрична. Например, если есть ребро от vertex i до vertex j , также должно быть ребро от vertex j до vertex i . На самом деле это одно и то же ребро.

 * 
  * 
    *     A'
  A   * 
        *
          * 
  

Алгоритм

Заметив эту природу, вы можете реализовать свой алгоритм так просто, как:

 void drawGraph(vertices[nRows][nCols])
{
    for (unsigned int i = 0; i < nRows;   i)
    {
        for (unsigned int j = i; j < nCols;   j)
        {
            drawLine(i, j);
        }
    }
}
  

Комментарии:

1. Хм, думаю, я неправильно задал вопрос.. У меня есть эта часть… Этот просто выведет матрицу adj…. Я хочу преобразовать матрицу adj в график… Я установил его, теперь я хочу создать график из матрицы, которую я опубликовал. У меня есть идея, но я не уверен … что-то вроде: node n1 = adjMatrix[0][0]

2. Я хочу знать, как создать вершины из этой матрицы и как перенести ребра из матрицы в них?

3. @user478984: adjMatrix[i][j] — это не сама вершина, она представляет, сколько ребер, соединяющих вершины i и j. i и j являются вершинами. Вы просите ВЫВЕСТИ график из матрицы чего-то другого?

4. я хочу преобразовать матрицу adj в график, а затем продолжить работу с DFS… Для меня все ясно, просто я не знаю, как создать график… из моей adj . матрицы. Это должно работать не только для этой матрицы adj, но и для любой матрицы as input …. хех ..

5. @user478984: Матрица смежности является представлением графика. Вы можете напрямую использовать DFS для этого.

Ответ №2:

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

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

const int adjmatrix[9][9] = {
  {0,1,0,0,1,0,0,0,0},
  {1,0,1,0,0,0,0,0,0},
  {0,1,0,1,0,0,0,0,0},
  {0,0,1,0,0,1,0,0,0},
  {1,0,0,0,0,0,1,0,0},
  {0,0,0,1,0,0,0,0,1},
  {0,0,0,0,1,0,0,1,0},
  {0,0,0,0,0,0,1,0,0},
  {0,0,0,0,0,1,0,0,0}
};

struct Node {
  vector<Node*> neighbours;
  /* optional additional node information */
};

int main (int argc, char const *argv[])
{
  /* initialize nodes */
  vector<Node> nodes(9);

  /* add pointers to neighbouring nodes */
  int i,j;
  for (i=0;i<9;  i) {
    for (j=0;j<9;  j) {
      if (adjmatrix[i][j]==0) continue;
      nodes[i].neighbours.push_back(amp;nodes[j]);
    }
  }

  /* print number of neighbours */
  for (i=0;i<9;  i) {
    cout << "Node " << i
         << " has " << nodes[i].neighbours.size() <<" outbound edges." << endl;
  }

  return 0;
}
  

Здесь граф представлен в виде массива узлов с указателями на достижимые соседние узлы. После настройки узлов и указателей на их соседей вы используете эту структуру данных для выполнения нужных вам алгоритмов построения графиков, в этом (тривиальном) примере выведите количество исходящих направленных ребер, которые имеет каждый узел.