如何创建相对于图中距离从单个节点传播的边

时间:2019-04-24 18:31:37

标签: java arraylist nodes graph-theory

我有一个图,需要创建从单个节点到到该节点有一定距离的所有节点(从初始节点到距离内的节点)的有向边。然后,它会创建从初始节点到距离这些节点的距离内的节点之间的边的边缘,并且一直进行到每个节点都至少有一个边缘为止。

我在代码中将其概念化并付诸实践时遇到问题。我目前有以下这段代码能正常工作,但效果还不够好,因为有时离初始节点较远的节点没有边缘:

//create patient zero
    graphVer.get(0).getValue().setInfected(true);
    graphVer.get(0).getValue().setRecentlyInfected(true);
    graphVer.get(0).getValue().setLevel(0);
    for(int i = 0; i < graphVer.size();i++) {
        for(int j = 0; j < graphVer.size();j++) {
            //checks each vertex against every other vertex, and if their distance is within limits and they aren't equal to each other, then create an edge between them
            if(distance(graphVer.get(i).getValue().getX(), graphVer.get(i).getValue().getY(),graphVer.get(j).getValue().getX(),graphVer.get(j).getValue().getY()) < dis.getRange()) {
                if(i != j) {
                    //makes sure that there is only one edge between two nodes and directs it based on where patient zero is
                    if(graphVer.get(i).getValue().getLevel() <= i && graphVer.get(j).getValue().getLevel() > graphVer.get(i).getValue().getLevel()) {
                        graphEdge.add(new Edge<>(0,graphVer.get(i),graphVer.get(j)));
                        graphVer.get(j).getValue().setLevel(i+1);
                    }
                }
            }
        }
    }

我没有包括创建顶点的代码,该代码只是在正方形边界内随机创建顶点以确保没有重叠。 graphVer是图形中所有顶点的数组列表,而graphEdge是图形中所有边的数组列表。

有什么更好的方法来使它每次都能正常工作?

2 个答案:

答案 0 :(得分:0)

您的措辞有点令人困惑,难道您不只是尝试到达距原始节点一定距离内的节点吗?如果真是这样,那么“有时候离初始节点较远的节点没有边缘”就是您想要的事情。

答案 1 :(得分:0)

我在评论中指出了您的问题规格中的缺点。

从概念上来说,我想想的是从所有边(v,w)的图G开始,其中dist(v,w)<= DIST 。这将包含许多周期。在此图中,您想要找到通过从起始顶点先搜索宽度来发现的树T。

要实现这一点,您无需构造G。正如您所推断的,您可以遍历所有顶点对并使用dist(v,w)<= DIST对其进行测试,以发现G中的边沿需要。

BFS使用队列。您最终将获得以下算法:

Let x be the start vertex
Let N be a set initially containing all vertices (not yet infected)
Let Q be a queue for vertices
Let T be the initially empty set of tree edges
Add x to Q and remove it from N // Infect x.
while Q is not empty
  Pop vertex v from the head of Q
  for each vertex w in N // Iterate through all non-infected vertices
    if dist(v, w) < DIST
      Add edge v->w to T // w is now infected
      add w to the tail of Q
      remove w from N
return T

这几乎可以逐行转换为Java。

请注意,输出必须是树,因为每个顶点w只能从N中删除一次。因此,在T中只能有v-> w形式的一个边。这意味着每个顶点最多具有一个父节点,这是有向树的定义。

正如我在评论中所说,如果它们之间的间隙太大,则不能保证这将包括树中的所有顶点。

只是为了好玩,这是随机放置的顶点的示例输出。起始顶点是朝向左上角的两倍大小。

请注意未包括的顶点,因为它们离任何感染源都太远了。这是正确的。