如何在树中找到相连的道路元素

时间:2019-06-12 20:58:25

标签: java algorithm data-structures graph

我有直线和点的列表,我需要获取基于点的连接线的列表。

输入为Line及其2点,因此在上例中输入为

enter image description here

以表格格式

enter image description here

,输出应为2个列表 [1,2,3,4,5,6,7]和[8]

我正在创建点到其所属的线列表的地图

A-1

B-1,2,3

C-2 ...

,然后尝试合并找到公共点的线列表。但是无法找到合并这些行的正确方法。 可以有简单的解决方案还是其他解决方案?

2 个答案:

答案 0 :(得分:0)

3行和5行不同吗? 如果是,那么很明显每行最多只能有2个点。 如果否,则表格格式不合适。

如果我是你,我会做一张地图,以一条线为键,以点列表为值。 然后创建一个接口,以定义一个点是否一次属于多条线。

答案 1 :(得分:0)

一种解决方案是创建点到点线的相邻贴图。

您定义给定点的相邻点是什么,线是什么:

class PointAdj {
    String point;
    String line;//Or int
}

将地图定义为:

Map<String, List<PointAdj>> pontAdjMap = new HashMap<>();

从表格开始阅读并填写地图:

(我假设输入是一个称为输入的二维数组)

for (int i =0; i < input.length; i++) {

    String[] row = input[i];
    List<PointAdj>> adj = pontAdjMap.putIfAbsent(row[1], new ArrayList<>());
    if(adj == null) {
        adj = pontAdjMap.get(row[1]);
    }
    adj.add(new PointAdj(row[2], row[0]));
    //Also put the reverse side
}

现在pontAdjMap包含所有点及其相邻点。

现在定义一个Set列表,以添加线并循环映射并尽可能多地添加线。

使用队列连续遍历相邻点;

List<Set<String>> lines = new ArrayList<>();
final Set<String> calculated = new HashSet();//Takes care of redundant processing of points;
pontAdjMap.keySet().foreach(pointInMap->{
    Set<String> lineSet = new HashSet();
    Queue<String> queue = new LinkedList<String>();
    queue.offer(pointInMap);
    while(!queue.isEmpty()) {
        String point = queue.poll();
        if(calculated.add(point)) {
            for(PointAdj pa: pontAdjMap.get(point)) {
                lineSet.add(pa.line);
                queue.offer(pa.point);
            }
        }
    }
    if(lineSet.size() > 0) {
        lines.add(lineSet);
    }
});

现在行应该是最终结果。

请注意,我没有测试此解决方案,它可能包含一些极端情况。但我认为总体思路还可以。