簡體   English   中英

如何從該圖中獲取所有路徑? 遞歸的?

[英]How to get all paths from this graph ? Recursive?

我有一組數據:

Point x = somepoint;

Point Y = somepoint;

List<Point> via1 = [1A, 1B, 1C];

List<Point> via2 = [2A, 2B, 2C, 2D];

...

List<Point> vian = [nA, nB, nC];

像這樣的可視化圖形(如上所述,它可以擴展到n層):

在此處輸入圖片說明

我想得到所有可能的路徑,如下所示:

List<List<Point> [
    List<Point> [x, 1A, 2A, y]
    List<Point> [x, 1A, 2B, y]
    List<Point> [x, 1A, 2C, y]
    List<Point> [x, 1A, 2D, y]
    List<Point> [x, 1B, 2A, y]
    ...
    List<Point> [x, 1C, 2D, y]
]

最好的方法是什么? 需要圖庫或一些遞歸函數或僅幾行linq?

謝謝 !

由於via1具有完全連接via2Xvia2與完全連接Y所有你需要IA小號循環是這樣的:

IEnumerable<Point[]> GetPathSet() 
{
    foreach(var v1 in via1)
        foreach (var v2 in via2)
            yield return new Point[] { X, v1, v2, Y}; 
}

如果您需要重用集合,只需將其轉換為數組或列表,如下所示: GetPathSet().ToArray()

UPD:如果您需要n n未預定義n圖層,則可以像這樣擴展它:

IEnumerable<List<Point>> GetPathSet(Point X, Point Y, params List<Point>[] layers)
{
    int[] layerindexes = new int[layers.Length];
    while (true)
    {
        var Path = new List<Point>();

        Path.Add(X);
        for (int i = 0; i < layers.Length; i++)
            Path.Add(layers[i][layerindexes[i]]);
        Path.Add(Y);

        for (int i = layers.Length - 1; i >= 0; i--)
        {
            layerindexes[i]++;
            if (layerindexes[i] >= layers[i].Count)
            {
                layerindexes[i] = 0;
                if (i == 0) yield break;
            }
            else break;
        }

        yield return Path;
    }
}

根據圖片,第n層的所有點都與(n + 1)層的所有點相連,您所需要的只是獲得“ via”列表的笛卡爾積。

如果預定義了“通過”列表的數量,則可以使用簡單的嵌套循環:

var allWays = new List<List<Point>>() 
foreach(var v1 in via1)
  foreach (var v2 in via2)
    ...
      foreach (var vn in vian)           
        allWays.Add(new Point[] { X, v1, v2,..., vn, Y});

或者您可以使用linq:

var allWays = 
    from v1 in vai1
    from v2 in vai2
    ...
    from vn in vain
    select new [] {x, v1, v2, ..., vn, y};

但是,如果您需要單個功能,該功能可用於任何層數計數,則需要將初始數據顯示為“列表列表”,並且代碼如下所示:

List<List<Point>> graphData; //all layers, where the first list contains x, the last one - y

IEnumerable<IEnumerable<Point>> allWays = new[] { Enumerable.Empty<Point>() };
foreach (var layer in graphData)
{
    var l = layer; 
    allWays =
              from w in allWays
              from item in l
              select w.Concat(new[] { item });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM