C++ 如何利用邻接矩阵生成无向图?

C++ 如何利用邻接矩阵生成无向图?,c++,matrix,C++,Matrix,大家好,到处都有一个解释,由绘图热创建出的图形adj。矩阵。然而,我需要简单的伪代码或算法。。。。我知道如何从…中画出来。矩阵,不知道为什么没有人在哪里解释如何在代码中实际把它。我不是指实际的代码,但至少是算法。。。许多人说。。1.如果有优势,我知道。。我已经创造了adj。矩阵,不知道如何将其转换为图形。我的顶点没有名称,它们只是矩阵的索引。例如1-9是“我的矩阵名称” 那本来是个迷宫。。。必须将第1列第4列标记为开始,第7列第8列标记为结束 没有人告诉过我如何实现矩阵外的图形(没有笔):Pp

大家好,到处都有一个解释,由绘图热创建出的图形adj。矩阵。然而,我需要简单的伪代码或算法。。。。我知道如何从…中画出来。矩阵,不知道为什么没有人在哪里解释如何在代码中实际把它。我不是指实际的代码,但至少是算法。。。许多人说。。1.如果有优势,我知道。。我已经创造了adj。矩阵,不知道如何将其转换为图形。我的顶点没有名称,它们只是矩阵的索引。例如1-9是“我的矩阵名称”

那本来是个迷宫。。。必须将第1列第4列标记为开始,第7列第8列标记为结束

没有人告诉过我如何实现矩阵外的图形(没有笔):Pp


感谢对称的本质

邻接矩阵是图的一种表示形式。对于无向图,其矩阵是对称的。例如,如果存在从
顶点i
顶点j
的边,则也必须存在从
顶点j
顶点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);
        }
    }
}
void绘图图(顶点[nRows][nCols])
{
for(无符号整数i=0;i
您可以将图形从邻接矩阵表示转换为基于节点的表示,如下所示:

#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(&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;
}
#包括
#包括
使用名称空间std;
常数整型调整矩阵[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}
};
结构节点{
矢量邻居;
/*可选的附加节点信息*/
};
int main(int argc,char const*argv[]
{
/*初始化节点*/
向量节点(9);
/*向相邻节点添加指针*/
int i,j;

对于(i=0;iAn邻接矩阵是表示图形的一种方式。你的意思是想转换为另一种表示方式吗?如果是,你想如何表示图形?嗯,我想我没有问对问题。我有那部分…那部分只是打印邻接矩阵…我想将邻接矩阵转换为图形…我现在已经设置好了我想从我发布的矩阵创建一个图形。我有一个想法,但不确定…类似于:节点n1=adjMatrix[0][0]我想知道如何从该矩阵创建顶点,以及如何将边从矩阵转移到它们?@user478984:adjMatrix[i][j]不是顶点本身,它表示连接顶点i和j的边的数量。i和j是顶点。你是在要求从其他矩阵中绘制图形吗?我想将adj矩阵转换为图形,然后继续进行DFS…对我来说一切都很清楚,只是不知道如何创建图形…从我的adj矩阵中。它没有o不仅适用于该邻接矩阵,还适用于任何作为输入的矩阵。…嘿..@user478984:邻接矩阵是图形的表示形式。您可以直接对其执行DFS。
#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(&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;
}