有向图的几个算法分析总结
无向图的一个特性就是其中一旦两个节点a和b是相连的,这就意味着有路径从a到b,同时也有从b到a的。它具体对应的矩阵表达方式对应着一个对称矩阵。而这里重点是考察有向图。和无向图比起来,有向图更加多了一种出入度的概念。因为方向的有向性,很多以前在无向图里看起来比较简单的问题在这里会变得更加有意思。
有向图定义
一个常用的有向图会如下图这样:
因为每个节点和节点之间对应着一定的方向关系,所以这里用一个箭头来表示从一个节点到另外一个节点的有向关系。在具体保存有向图定义的数据结构里,我们还是可以采用一样的链表组结构。只是因为是有向图,所以加入元素的时候不用考虑对称节点的问题。在实现上其实也更加简化。
下面是一个关于有向图的简单定义实现:
public class Digraph {
private final int vertices;
private int edges;
private List<LinkedList<Integer>> adj;
public Digraph(int vertices) {
if(vertices < 0) throw new IllegalArgumentException(
"Number of vertices in a Digraph must be nonnegative");
this.vertices = vertices;
this.edges = 0;
adj = new ArrayList<LinkedList<Integer>>();
for(int i = 0; i < vertices; i++) {
adj.add(new LinkedList<Integer>());
}
}
public void addEdge(int v, int w) {
if(v < 0 || v >= vertices)
throw new IndexOutOfBoundsException(
"vertex " + v + " not in bound.");
if(w < 0 || w >= vertices)
throw new IndexOutOfBoundsException(
"vertex " + w +