【问题标题】:Inserting an element in a graph represented with adjacency matrix在用邻接矩阵表示的图中插入元素
【发布时间】:2019-01-29 09:34:36
【问题描述】:

我正在学习 C 中的图形数据结构,并且我已经用邻接矩阵表示了一个图形。到目前为止,我创建了邻接矩阵,这意味着(至少在我的理解中)我已经指定了“在哪些顶点之间会有边”,尽管我还没有创建任何实际的节点。现在,在我完成之后,我想用包含我自己的数据类型的节点(比如包含一些元素的结构中的每个节点)来实际填充我的图表。我用谷歌搜索了很多,但我发现的只是有关如何创建邻接矩阵的示例,但解释会停在那里,而不会显示您如何在图中实际插入新元素。

我已经编写了填充邻接矩阵的代码。我提供了以下代码:

#include<stdio.h>
#define V 5

void init(int arr[][V])
{
  int i,j;
  for(i = 0; i < V; i++)
  for(j = 0; j < V; j++)
   arr[i][j] = 0;
}

void addEdge(int arr[][V],int src, int dest)
{
  arr[src][dest] = 1;
}

void printAdjMatrix(int arr[][V])
{
     int i, j;

     for(i = 0; i < V; i++)
     {
         for(j = 0; j < V; j++)
         {
           printf("%d ", arr[i][j]);
         }
     printf("\n");
 }
}

int main()
{
  int adjMatrix[V][V];

  init(adjMatrix);
  addEdge(adjMatrix,0,1);
  addEdge(adjMatrix,0,2);
  addEdge(adjMatrix,0,3);
  addEdge(adjMatrix,1,3);
  addEdge(adjMatrix,1,4);
  addEdge(adjMatrix,2,3);
  addEdge(adjMatrix,3,4);

  printAdjMatrix(adjMatrix);

  return 0;
}

现在我的问题是:要使用新节点填充我的图表,我是否必须创建另一个大小为 noofnodes x noofnodes 的数组并填充它?这是正确的方法还是有其他方法?我想知道这样做的正常和被认为正确的方法是什么。

感谢您的阅读。

【问题讨论】:

  • 我不明白你的问题,要创建你的图(节点),不一定要有一个支持邻接矩阵的数组,我的意思是你可以直接创建它以便用新节点填充它是一样的
  • @bruno 所以我创建了邻接矩阵,它显示了节点之间的连接在哪里,或者在创建节点后更好地说“将在”。现在说我想创建两个节点。如何将新创建的节点与我刚刚创建的邻接矩阵“链接”?可以举个例子吗?
  • 基本上这个例子应该有帮助:我在节点 0 到节点 1 之间有一条边。请告诉我如何创建这两个节点并将它们链接起来,以便它们具有矩阵中所示的连接(来自0 到 1)。我知道我可能无法清楚地解释所有内容,但我希望您能理解我的意思:D。谢谢

标签: c graph


【解决方案1】:

我认为最简单的实现方法如下:

  • 将每个节点(例如用字符串表示)映射到一个整数
  • 将此映射存储在表示 Graph 对象的类中
  • 不存储整数数组,而是存储std::vector&lt;std::vector&lt;int&gt;&gt;

现在当你添加一些东西时,这个过程变得非常简单:

  • 将新节点添加到映射中,其对应的整数为邻接矩阵的大小std::vector&lt;std::vector&lt;int&gt;&gt;
  • 向邻接矩阵添加一个新的std::vector&lt;int&gt;,用零填充

更新邻接矩阵很容易:

public void setAdjMat(const std::string& n0, const std::string& n1, int c){
    int i0 = nodeMap[n0];
    int i1 = nodeMap[n1];
    adjecencyMatrix[i0][i1] = c;
}

优点:

  • 添加只需要很少的努力,并且不需要重构整个邻接矩阵
  • 删除可以通过两种方式实现;从nodeMap 中删除和/或从adjecencyMatrix 中删除

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多