当前位置: 首页 > 知识库问答 >
问题:

消除孤立顶点并重新排序结果图顶点的有效方法

乐正宜人
2023-03-14

对于一个头衔来说,这真是太多了,但接下来就是。我面临的问题是从输入流中读取一组无向边和一些顶点,然后输出一组边。我输出的边集不能有任何“空白”——我的意思是,我不能有一个(1,2)、(2,4)和(4,5)的边集,因为顶点集中永远不会提到3。

这个图是不允许的,因为2是“空白”

此图是允许的,因为连接图中没有“空白”。有4个顶点,编号为1到4。这个图表的输出将是[[1,3][3,4][4,2][2,1]]

到目前为止,我是如何做到这一点的:

当我知道有多少个顶点时,我会将它们的所有索引添加到包含所有孤立顶点的HashSet中。当我从输入流中读取边缘时,我会从HashSet中删除每条边缘的两个顶点。之后,我会将它们添加到一个具有维度(|V|,2)的2D数组中。如果在我接收所有边缘后有任何孤立的顶点,我会调用我的“重新排序方法”。

它的作用如下:

  • 将2D矩阵和孤立顶点集作为输入

在伪这是(程序本身是用Java编写的)

reorderMethod(matrix M, isolated vertex set I) 
  matrixProperties = findMatrixProperties(M) // matrixProperties is an instance of a helper class MatrixProperty which holds two integers, max and nrOfVertices
  while (max > nrOfVertices) 
    for row in M
      for col in M 
        if M[col, row] = max:
          M[col, row] = min(I)
    // Remove min(I) from I 
    matrixProperties = findMatrixProperties(M)

我有没有办法让这更有效?

共有1个答案

袁法
2023-03-14

如果我正确理解了你的问题,你想找到一个图的顶点的规范重新编号,这样就没有一个完全未连接的节点比连接的节点有更小的标签。

简单的解决方法是用较小标签连接的顶点数来标记每个顶点。(这将从0开始对顶点进行编号,而不是从1开始,但您可以很容易地为每个标签添加一个顶点。)

您似乎使用的是布尔NxN数组,而不是邻接列表,所以我就是这样编写下面的伪代码的。不过,对邻接列表的更改微不足道。

我们首先通过对每一行应用运算符,将布尔数组简化为布尔向量。一个节点连接到某个东西,除非它的整行为false,所以布尔向量足以告诉我们一个节点是否连接。显然,当我们点击第一个true值时,我们可以停止扫描一行。然后,我们将布尔向量重新解释为0和1的整数向量,并在向量上做一些非常类似于累积和的事情,这样向量将包含每个条目中具有较小标签的连接组件的数量,这意味着,如果忽略未连接的顶点,生成的向量正是从旧标签到规范标签的转换。(可以为所有顶点构造转换;下面的伪代码将通过重新编号上一个标签下未连接的顶点来实现。)

我使用了类似python的伪代码,因为Java对我来说不够伪:)

# M is an adjacency matrix; we assume that it is square.
# The function returns the translation vector
def renumber(M):
  ones = 0
  zeros = len(M) - 1
  trans = []
  for row in M:
    if any(row):
      # the edge is connected
      trans.append(ones)
      ones += 1
    else:
      # the edge is unconnected
      zeros -= 1
      trans.append(zeros)
  return trans
 类似资料:
  • 本文向大家介绍图的顶点度,包括了图的顶点度的使用技巧和注意事项,需要的朋友参考一下 它是与顶点V相邻的顶点数。 表示法-deg(V)。 在一个具有n个顶点的简单图中,任何顶点的度为- 顶点可以与除自身以外的所有其他顶点形成边。因此,顶点的度数将取决于图中的顶点数减去1。此1用于自顶点,因为它本身无法形成循环。如果任何一个顶点处都有一个循环,则它不是简单图。 可以在两种情况下考虑顶点度- 无向图 有

  • 删除顶点命令用于从数据库中删除顶点。 在删除时,它会检查并保持与边缘的一致性,并将所有交叉引用(带边)移除到已删除的顶点。 以下语句是删除顶点()命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 使用其类,记录标识或子查询定义要移除的顶点。 - 过滤条件以确定命令删除哪些记录。 - 定义要删除的最大记录数。 — - 定义命令一次删除多少个记录,允许您将大型事务分解为更小的块以节省内存使用

  • 我有一个无向连通图,我想通过移除顶点而不是边来隔离它的所有顶点,我想保持我移除的顶点数量最小。我知道要实现这一点,我必须每次移除程度最高的顶点,直到图断开。但是我需要为它写一个Java的程序,我不知道如何跟踪程度最高的顶点以及使用哪种数据结构。我得到了以下输入。 :分别表示顶点和边的数量。 :指定边的顶点对 样本输入: 示例输出:(这是需要删除的最小数量的顶点,使顶点隔离) 限制条件:

  • 是否有可能重命名igraph中的顶点。我想在顶点上用不同的符号多次绘制某个图。鉴于以下igraph az: 具有 我想把顶点改成,比如说y1-y27, 它不起作用。我怎样才能做到这一点?提前谢谢。 干杯 编辑:用于记录。 以这种方式工作,使其返回: 但是,plot(az)仍然返回带有x节点的图形

  • 本文向大家介绍图的边和顶点,包括了图的边和顶点的使用技巧和注意事项,需要的朋友参考一下 图是一组称为节点或顶点的点,它们由一组称为edge的线互连。图形或图形理论的研究是数学,工程学和计算机科学领域中许多学科的重要组成部分。 图论 定义-图形(表示为G =(V,E))由一组非空的顶点或节点V和一组边缘E组成。顶点a 表示边缘的端点。一条边连接两个顶点a,b ,并由其连接的一组顶点表示。 示例-让我

  • 我对vert.x非常陌生,我有一个非常基本的问题:假设一个顶点包括一些顶点。通常说一个顶点是单线程的。这是否意味着,如果一个顶点正在被处理,那么属于同一顶点的另一个顶点将不得不等待,直到第一个顶点结束,然后它(另一个顶点)将能够开始它的工作?我的意思是在同一个顶点中的顶点之间没有上下文切换。