【问题标题】:C# Vertex EdgesC# 顶点边
【发布时间】:2016-06-04 08:47:57
【问题描述】:

我在完成这项任务时遇到了问题:如果一个 n 顶点图有一个顶点 1(刺)连接到一个顶点 2(尾部)连接一个顶点 3(身体)连接到另一个顶点,那么它就是一个蝎子顶点(脚)。一些脚可能连接到其他脚。设计一个算法来判断给定的图画是否代表一只蝎子,并判断哪条线是刺、尾巴、身体和脚。 这是我要读取的数据文件: (+) is where is edge and (-) where are no edges

我试图先找到刺痛,但基本上我如何才能搜索与尾巴和身体的联系? 我也必须使用递归 编辑: 好的,现在我发现每行中有多少“+”:

int[] B = new int[100];
       for (int i = 0; i < n; i++)
       {
           for (int j = 0; j < n; j++)
           {
               int HowMuch = Regex.Matches(A[i,j], @"\+").Count;
               Saving[i] += HowMuch;
           }
           if(Saving[i]>=3)
           {
               Console.WriteLine("It's a scorpion!");
               Console.WriteLine("The body is in: " + i + " part");
           }
       }

通过递归,我试图找到路径连接......我应该如何继续?

static void Find(string[,] A, int n, int j)
    {
        for (int i = 0; i < n; i++)
        {
            if(A[i,j]=="+")
            {
                j = i;
                Find(A, n, j);
            }
        }

    }

【问题讨论】:

  • 据我了解,您只需找到所有长度为 3 的路径,过滤那些与前两个顶点没有其他连接但与后两个顶点至少有两个连接的路径。邻接矩阵(您实际拥有的)multiplication 将允许清除许多错误的起始顶点(只需将其乘以两次并从具有一个 3 长度路径的“顶点”开始)。
  • Here 是你刚才问的问题,here 是一个提示。你可以看看。
  • 这里的*是什么意思?微不足道吗?还有,你提供的样品,是蝎子吗?或者你必须找出答案?
  • @S_kar 是的,这无关紧要

标签: c# algorithm matrix graph adjacency-matrix


【解决方案1】:

所以,我给你一个关于如何解决这个问题的想法。我从this 那里得到了帮助。你应该看看那里。该网站上有提示。

我的方法与他们的略有不同。

从抽象的角度来看,您是在询问,从邻接矩阵中,确定给定的点是否像这个图像(又名蝎子)。 (取自该网站)

现在,邻接矩阵如何转换为蝎子?让我们看看你的例子。 我手工绘制了邻接矩阵和图形。我希望它不会太难理解。

现在怎么解决?您可以在此处计算每个节点的度数。您可以从此处的邻接矩阵计算它。 (度数是指一个节点所连接的节点数,比如我画的那个图,1的度数是1,0的度数是2,以此类推……)

首先你会在这里找到所有节点的度数(节点表示顶点,反之亦然)。

所以,刺应该是一级的刺。现在有这个问题,我会回到它。不过暂时先不考虑。

尾巴的度数为 2。它会与刺相连。所以,你找到一个与 sting 连接的节点,你就完成了。那是尾巴。

与tail相连的节点(除了sting)是body。

主体的度数 >= 2。因此,如果有一个度数这么高的顶点,那么肯定就是主体。与它相连的节点是脚。

现在你可能会说,脚是 2 度的,那为什么不是尾巴呢?因为它们没有连接到 sting。(你之前已经计算过了)

你也可以说,脚是1度的,为什么不刺痛呢?因为它连接到某个度数 > 2 的节点,不能是(因为尾部的度数为 2)

现在一切都很好,但是考虑一个问题,如果图表是这样的,

1-0-3-4

那么刺是什么,脚是什么?我的答案是两者兼而有之。 1 和 4 都可以是腿或刺。

我希望你明白我所说的。

如有需要,请对图片进行说明: 你说,有+的地方就有优势。注意第 0 行的 1 和 3 上的 +。所以,0 连接到 1 和 4。我就是这样连接它们的。并且连接是双向的。你可以从邻接矩阵中看到。

【讨论】:

  • 通过递归我试图找到路径连接...我应该如何继续? static void Find(string[,] A, int n, int j) { for (int i = 0; i
  • 好吧,我已经告诉你逻辑了。正如我所说,首先计算度数(应该使用循环),然后根据我在答案中描述的每个步骤进行计算。只有递归,你无法实现我的步骤。如果您仔细阅读我的回答,我认为您应该能够实现这一点。
  • 您可以反复检查条件。这样会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多