从图表

时间:2016-03-02 14:42:11

标签: algorithm networking graph nodes diagram

我正面临一个需要某种算法的问题,它允许我从图中获取主线。主线基本上是馈线网络。在图表上,它将是为子节点提供信息的主要节点。下图解释了。enter image description here

所以上图中的主线是1,2,3,4,5。每个节点都包含一个属性,它是连接节点的列表;所以数字3将包含2,4和10.我开始认为首先我应该摆脱有一个连接到它们的节点,但这将留下一些不需要的节点,因此如果我要删除6 ,7,8,9,11,13,12我仍然有一个10的不需要的节点。

对于那些不了解馈线网络的人来说,它基本上是一堆结构,人孔,手孔,机柜,从根结构传递信号1通过2将其分配到区域,3,4和5,直到它到达客户。对于10,它是一个子人孔结构,它简单地不是主网络的一部分,因为它分布在分支内。现在我知道它们是什么,但在代码中。这些都只是一堆包含它们所连接的对象。没有类型也没有。

3 个答案:

答案 0 :(得分:1)

根据您给出的部分答案,我认为添加另一个属性会为您提供解决方案。

到目前为止,你有1,2,3,4,5和10。

问题是10,正如我们所知,不应该是支线网络的一部分(因为它是一个分支)。

如果您回头看,您可以看到,对于除10之外的所有节点,从节点到源的路径和从节点到目的地的一条路径(您通过流程从中选择的最后一个节点)队列)没有任何边缘被访问两次。

前:

1.)3-> 2-> 1(来源)& 3-> 4-> 5(目的地)

2。)4-> 3-> 2-> 1(来源)& 4-> 5(目的地)

但是在10的情况下,一个边缘将被访问两次。

如同,

10-> 3 - &gt; 2-> 1&amp; 10→<强> 3 - 将4-→5

在这里,正如您所看到的,边缘10-3被访问两次,这在其他节点的情况下不会发生。

通过此过程,任何不属于馈线网络的节点都将被丢弃。

根据提供的信息,这将提供正确的解决方案。

答案 1 :(得分:1)

我建议您从起始节点递归搜索。通过节点下降,跟踪您已经传递的节点数。 保留2个数组(或链接列表),一个用于当前路径,另一个用于最长路径。在下降时将节点添加到当前数组,并在返回时将其删除。对最长路径数组执行相同操作,但只有在超过当前最长路径时才添加它。当您搜索整个图形时,删除阵列中的最后一个节点(因为它不会成为主路径的一部分)。

这可能是一种更有效的方法,我必须考虑一下。

答案 2 :(得分:1)

此代码为您返回主线:

static void Main()
{
    Node node1 = new Node(1, null);
    Node node6 = new Node(6, node1);
    Node node2 = new Node(2, node1);
    Node node7 = new Node(7, node2);
    Node node8 = new Node(8, node2);
    Node node3 = new Node(3, node2);
    Node node10 = new Node(10, node3);
    Node node8_ = new Node(8, node10);
    Node node11 = new Node(11, node10);
    Node node4 = new Node(4, node3);
    Node node5 = new Node(5, node4);
    Node node12 = new Node(12, node5);
    Node node13 = new Node(13, node5);

    List<List<Node>> MainLines = new List<List<Node>>();
    foreach (var i in Node.HighestRankNodes)
    {
        List<Node> m = new List<Node>();
        m.Add(i);
        Node j = i.Parent;
        while (j != null)
        {
            m.Insert(0, j);
            j = j.Parent;
        }
        MainLines.Add(m);
    }
    foreach (var i in MainLines) Console.WriteLine("Mainline: " + string.Join(", ", i));
    Console.ReadLine();
}

节点类:

public class Node
{
    public int Number;
    public Node Parent = null;
    public int Rank = 0;

    public static int currentMaxRank = 0;
    public static List<Node> HighestRankNodes = new List<Node>();

    public Node(int number, Node parent)
    {
        Number = number;
        Parent = parent;
        Rank = Parent != null ? Parent.Rank + 1 : 0;
        if (currentMaxRank < Rank)
        {
            currentMaxRank = Rank;
            HighestRankNodes.Clear();
        }
        if (currentMaxRank == Rank) HighestRankNodes.Add(this);
    }

    public override string ToString()
    {
        return Number.ToString();
    }
}

输出:

Mainline: 1, 2, 3, 4, 5, 12
Mainline: 1, 2, 3, 4, 5, 13