有向图和无向图 - Java

时间:2013-02-17 12:28:44

标签: java graph

我正在实施一些算法来教自己关于图形以及如何使用它们。你会推荐什么是在Java中最好的方法?

我只是想问你,如果你能给出一个简短的帮助,只需简单的有序图和加权有向图的类定义?

我浏览了网页,但我不想要它的实现,只是对类的简短定义....你认为最好的数据结构是什么?相邻列表?

对于无向图,我将其定义如下:

public interface Graph { 
  Collection vertices();  // returns a collection of all the 
        //   Vertex objects in the graph 
  Collection edges();  // returns a collection of all the 
     //   Edge objects in the graph 
  Collection incidentEdges(Vertex v); // returns a collection of  
       //   Edges incident to v 
  boolean isAdjacent(Vertex v, Vertex w); // return true if v and     
}                 //   w are adjacent 

public class Vertex { 
  public boolean visited;  // initially false for all vertices 
} 

public class Edge { 
  Vertex v1, v2;     // undirected edge 
  Vertex opposite(Vertex v); // given a vertex return the one 
}          // at the other end of this edge 

2 个答案:

答案 0 :(得分:1)

这是一个简单的实现(对于许多基本用例来说应该足够了):

public class Graph { 
  public List<Node> nodes = new ArrayList<Node>();
}                

public class Node{
  public List<Node> neighbors = new ArrayList<Node>();
 //here you can add stuff like "public boolean visited;", if your algorithm requires it
} 

(这只是一个例子 - 有很多方法可以实现图形结构)。

答案 1 :(得分:0)

要使用的数据结构取决于代码的用途...列表通常做得很好,但如果图形高度连接(大多数节点连接到大多数节点),那么列表很麻烦,并且通常首选某种矩阵。

例如,要使用矩阵,请保留节点矢量,然后使用整数的二维矢量来引用节点。

此外,为了创建一个轻量级类,您不必为节点声明一个类:您可以提供添加节点和边的函数,并且可以使用整数来标识这些元素。

如果您计划对它们进行子类化(例如,在执行显示图形的GUI时可能很有用),那么使用Node或Edge类可能是合适的,但如果您需要某些算法的图形,则使用整数标识节点/边缘更快更简单。