[英]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
具有完全連接via2
和X
和via2
與完全連接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.