从A到B的最短路径,没有多余的边缘(在Java中)

时间:2011-12-11 02:04:30

标签: java graph-algorithm shortest-path

我有一个任务,我需要构建一个简单的无向图,计算两点之间的路径,并计算结果路径的容量。

我已经进行了容量计算。并且路径打印输出显示也可以找到两点之间的路径,但是我无法摆脱导致死胡同的边缘而不会完全破坏我的代码。我已经尝试过从死胡同中反弹,但到目前为止我还没有工作过。使用多边形顶点的任何路径当前都显示连接到该顶点的所有边,无论该点是在路径的中间还是设置为开始/结束。基本上,它涵盖了给定点之间的所有边缘,甚至是多余的边缘。

到目前为止,我的代码如下。我试图从路径中删除死端边缘,但仍然存在。

任何人都可以帮我解决这个问题吗?


  public Queue<Edge> SearchPaths(Vertex x, Vertex eelmine) {

      if(visited.isEmpty())
          lopp = x; // ?? start = x; ??

      if(visited.indexOf(x) > -1) 
          return null;

      if(x.isEquals(lopp)) {
          Edge serv = x.leiaServ(eelmine);
          if(serv != null)
              rajad.add(serv);
      }

      Edge serv = x.first;
      while (serv != null) {
          if(visited.indexOf(serv.target) == -1)
              if(serv != null)
                  rajad.add(serv);
          serv = serv.next; // ?? serv += serv.next
      }
      visited.add(x);

      // otsi uuest tipust järgmine serv
      if(visited.indexOf(x.first.target) == -1) {
          Vertex jarg = x.first.target;

      Edge uusserv = jarg.leiaServ(x);
      if(uusserv != null)
          rajad.add(uusserv);
      SearchPaths(jarg, x);


          /* "dead-end edges" .. not correct, breaks code

          // nt. x=C, jarg=D, D != lopp ... jarg.jarg == C (C-D-C)
          if(jarg!=lopp && visited.indexOf(jarg.first.target) != -1)
                  jarg.equals(x);

          // x=C, jarg=E, E == lopp ... x == jarg
          // x=C, jarg=A, A != lopp ... jarg.jarg == B (C-A-B)
          if(jarg!=lopp && visited.indexOf(jarg.first.target) == -1) {
              jarg.leiaServ(x);
              rajad.add(serv);
              x.equals(jarg);   // liiguta x edasi
              SearchPaths(jarg, x);
          }*/
      }
      return rajad;
  }
} // Vertex ehk Tipp

1 个答案:

答案 0 :(得分:3)

如果您使用优先级队列实现它,请参阅Djikstra's algorithm,您只需要在到达死胡同的路径上加上“无限”权重,就不会再次访问它。

“min”优先级队列是一个数据结构,用于弹出附加权重最小的元素。因此,当您遍历时,您将为每次遍历构建队列(通过步行到节点的邻居)。所以如果你到达了一个节点:

  • 没有边缘(是叶子节点)
  • 到已经遍历的节点的边缘(为了避免环形交叉循环遍历)

然后你只需要在路径上放置最大重量。在Java中,您可以int使用Integer.MAX_VALUElong使用Long.MAX_VALUE