达到分支

时间:2015-08-06 01:09:42

标签: java jgrapht digraphs

我使用jgrapht库创建了一个有向图。我使用successorListOf()方法访问顶点的后继,但我希望能够到达给定顶点的第n个后继(在我的情况下是Point对象)。我的有向图有两个分支(这里名为B和C)。我制作了一个简单而简短的代码,以便更轻松:

public static DirectedGraph<Point, DefaultEdge> directedGraph = new DefaultDirectedGraph<Point, DefaultEdge>(DefaultEdge.class);
public static Point startPoint = new Point(2, 6, "S");
public static Point firstPoint = new Point(2, 7, "A");
public static Point secondPoint = new Point(2, 8, "B");
public static Point thirdPoint = new Point(2, 9, "B");
public static Point fourthPoint = new Point(2, 10, "B");
public static Point fifthPoint = new Point(3, 7, "C");
public static Point sixthPoint = new Point(4, 7, "C");
public static Point seventhPoint = new Point(5, 7, "C");


void setup ()  {
  directedGraph.addVertex(startPoint);
  directedGraph.addVertex(firstPoint);
  directedGraph.addVertex(secondPoint);
  directedGraph.addVertex(thirdPoint);
  directedGraph.addVertex(fourthPoint);
  directedGraph.addVertex(fifthPoint);
  directedGraph.addVertex(sixthPoint);
  directedGraph.addVertex(seventhPoint);
  directedGraph.addEdge(startPoint, firstPoint);
  directedGraph.addEdge(firstPoint, secondPoint);
  directedGraph.addEdge(firstPoint, thirdPoint);
  directedGraph.addEdge(firstPoint, fourthPoint);
}

// --------------------------------------------------------------
public static ArrayList<Point> pointList = new ArrayList<Point>();
public static class Point {

  public int x;
  public int y;
  public String iD;
  public  Point(int x, int y, String iD) 
  {

    this.x = x;
    this.y = y;
    this.iD= iD;
  }
  @Override
    public String toString() {
    return ("[x="+x+" y="+y+" iD="+iD+ "]");
  }

  @Override
    public int hashCode() {
    int hash = 7;
    hash = 71 * hash + this.x;
    hash = 71 * hash + this.y;

    return hash;
  }



  @Override
    public boolean equals(Object other) 
  {
    if (this == other)
      return true;

    if (!(other instanceof Point))
      return false;

    Point otherPoint = (Point) other;
    return otherPoint.x == x && otherPoint.y == y;
  }
}

我想在第一个点和&#34; B&#34;的每个点之间添加一条边。分支,而不是:

directedGraph.addEdge(firstPoint, secondPoint);
  directedGraph.addEdge(firstPoint, thirdPoint);
  directedGraph.addEdge(firstPoint, fourthPoint);

我想使用:

for (Point successor : Graphs.successorListOf (directedGraph, firstPoint)) {
        if (successor.type.equals("B") {
               directedGraph.addEdge(firstPoint, successor);
        }
}

但是在这里我只能到达分支B的第一个继承者。在第n个继任者的情况下,我怎样才能达到继任者的继承者? B分支中的顶点数量可能会发生变化,这就是为什么我要寻找一种自动执行此操作而不是逐点的方法。

我怎么能这样做?

在图纸上,1将是我的startPoint,2将是我的第一个点,然后有两个分支,这将是我的B&amp; C分支

On the drawing,1 would be my startPoint, 2 would be my firstPoint, and then there are two branches which would be my B & C branches

1 个答案:

答案 0 :(得分:1)

我编写了以下代码,但未经过测试,您可能需要对其进行修改以满足您的要求。

此代码使用您在提供的示例中使用的变量和实例,将DFS(深度优先搜索)运行到预定义的深度。

{{1}}