我正面临一个需要某种算法的问题,它允许我从图中获取主线。主线基本上是馈线网络。在图表上,它将是为子节点提供信息的主要节点。下图解释了。
所以上图中的主线是1,2,3,4,5。每个节点都包含一个属性,它是连接节点的列表;所以数字3将包含2,4和10.我开始认为首先我应该摆脱有一个连接到它们的节点,但这将留下一些不需要的节点,因此如果我要删除6 ,7,8,9,11,13,12我仍然有一个10的不需要的节点。
对于那些不了解馈线网络的人来说,它基本上是一堆结构,人孔,手孔,机柜,从根结构传递信号1通过2将其分配到区域,3,4和5,直到它到达客户。对于10,它是一个子人孔结构,它简单地不是主网络的一部分,因为它分布在分支内。现在我知道它们是什么,但在代码中。这些都只是一堆包含它们所连接的对象。没有类型也没有。
答案 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