如何检查DirectedSparsedGraph是否包含具有这2个节点的节点之间的边缘?

时间:2014-05-21 16:23:47

标签: java graph distance jung knn

我正在尝试使用jung库实现kNN图的创建。我已经到了需要检查图中是否已存在2 Node之间的链接的时刻。

到目前为止我的代码:

for (int i = 0; i < k; i++) {
  for (Iterator<Node> it1 = mGraph.getVertices().iterator(); it1.hasNext();) {
    Node n1 = (Node) it1.next();
    double minDistance = 9999999;
    Node toConnect = null;

    for (Iterator<Node> it2 = mGraph.getVertices().iterator(); it2.hasNext();) {
      Node n2 = (Node) it2.next();
      double currDistance = this.getDistance(n1, n2);
      if( currDistance < minDistance &&  
          mGraph.containsEdge( /* WHAT HERE */ ) ){
        minDistance = currDistance;
        toConnect = n2; 
      }   
    }   
    mGraph.addEdge(new Link(), n1, toConnect, EdgeType.DIRECTED);   
  }           
}

我不知道怎么做,因为Link只有一个没有任何参数的构造函数。

3 个答案:

答案 0 :(得分:1)

我发现我可以通过以下方式执行此操作(如果有效且可以,可能有人会发表评论)

mGraph.isNeighbor(n1, n2)

答案 1 :(得分:1)

isNeighbor()适用于无向图或如果您不关心两个节点是如何连接的(即,现有边缘的方式,如果有的话)。对于有向图,您可能需要isPredecessor()。

答案 2 :(得分:0)

例如,如果您有两个节点,n1和n2,并且您的图形称为mGraph,则只需创建一个新方法:

public boolean existsLink(Node n1, Node n2) {
  return mGraph.getNeighbors(n1).contains(n2);
}

如果返回true,则表示边缘存在;如果边不存在,则返回false。请注意,mGraph.getNeighbors(n1)是一个集合。

您还可以使用以下方法:mGraph.containsEdge(E edge)。但我不知道哪种类型是你的E边缘,以及它有哪些方法。