【发布时间】:2016-08-13 02:49:29
【问题描述】:
我需要从任意车站请求的单次行程序列中重建铁路网络中的车站序列。数据中没有给出方向。但是每个请求都会返回一个终端站。单次旅行的序列可以有间隙。 (最终)结果始终是一个线性列表 - 不允许分叉。
例如:
请求站“4”的行程结果:
4 - 3 - 2 - 1
4 - 1
4 - 5 - 6
4 - 8 - 9
4 - 6 - 7 - 8 - 9
手动重新排序:
1 - 2 - 3 - 4
1 - 4
- 4 - 5 - 6
- 4 - 8 - 9
- 4 - 6 - 7 - 8 - 9
合并后的结果应该是:
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9
开始/停止:1、9
是否有一种算法可以计算得到的“珍珠绳”列表?我试图用 perls graph-module 来解决这个问题,但没有运气。我关于算法的书也无济于事。
我认为,在某些病理情况下,可能有多种解决方案,具体取决于输入数据。
也许有人有解决它的想法!
正如您在答案中看到的,解决方案不止一种。所以这是一个真实世界的数据集:
2204236 -> 2200007 -> 2200001
2204236 -> 2203095 -> 2203976 -> 2200225 -> 2200007 -> 2200001
2204236 -> 2204805 -> 2204813 -> 2204401 -> 2219633 -> 2204476 -> 2202024 -> 2202508 -> 2202110 -> 2202026
2204236 -> 2204813 -> 2204401 -> 2219633 -> 2202508 -> 2202110 -> 2202026 -> 3011047 -> 3011048 -> 3011049
2204236 -> 2204813 -> 2204401 -> 2219633 -> 2204476 -> 2202024 -> 2202508 -> 2202110 -> 2202352 -> 2202026
2204236 -> 2204813 -> 2204401 -> 2219633 -> 2204476 -> 2202024 -> 2202508 -> 2209637 -> 2202110
用 perl 解决示例数据:
use Graph::Directed;
use Graph::Traversal::DFS;
my $g = Graph::Directed->new;
$g->add_path(1,2,3,4);
$g->add_path(1,4);
$g->add_path(4,5,6);
$g->add_path(4,8,9);
$g->add_path(4,6,7,8,9);
print "The graph is $g\n";
my @topo = $g->toposort;
print "g toposorted = @topo\n";
输出
> The graph is 1-2,1-4,2-3,3-4,4-5,4-6,4-8,5-6,6-7,7-8,8-9
> g toposorted = 1 2 3 4 5 6 7 8 9
使用另一个方向
$g->add_path(4,3,2,1);
$g->add_path(4,1);
$g->add_path(4,5,6);
$g->add_path(4,8,9);
$g->add_path(4,6,7,8,9);
揭示第二个解决方案
The graph is 2-1,3-2,4-1,4-3,4-5,4-6,4-8,5-6,6-7,7-8,8-9
g toposorted = 4 3 2 1 5 6 7 8 9
【问题讨论】:
-
4 - 5 - 6 - 7 - 8 - 9 - 3 - 2 - 1也是一种解决方案。 -
为什么这是一个解决方案? 9和3之间没有联系。9只和8联系。
-
我对您的问题的理解是,您需要找到这样的电台列表,其中每个给定列表都是子列表。您和我的解决方案都具有此属性。否则,我不理解“连接”一词。
-
哦,好的,现在我有了。所以在这个例子中没有单一的解决方案。