时间:2019-10-09
本文章向大家介绍图,主要包括图使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  图是一种用结点和边来表示关系的数据模型,一般用来表示多对多关系。图分为无向图和有向图两种。例如:

  

  无向图中“A — B”表示A可以直接到达B,B也可以直接到达A;有向图中“A —> B”表示A可以直接到达B,而B不能直接到达A。即无向图的边是双向可达的,有向图的边是单向可达的。

图的表示

  图可以用一个二维数组表示,其中0表示不能直接到达,1表示可以直接到达。例如:

  

  可以表示为:

  A B C D
A 0 1 1 1
B 1 0 1 1
C 1 1 0 1
D 1 1 1 0

   

  可以表示为:

  A B C D
A 0 1 1 0
B 0 0 1 1
C 0 0 0 1
D 1 0 0 0

  图还可以用一个链表数组表示,链表中的元素为该结点可以直接到达的结点。例如:

  

  可以表示为:

A B -> C -> D
B A -> C -> D
C A -> B -> D
D A -> B -> C

   

  可以表示为:

A B -> C
B C -> D
C D
D A

  用链表表示图的代码如下:

 1 public class Graph {
 2 
 3     private ArrayList<String> vertices;
 4     private ArrayList<LinkedList<String>> edges;
 5 
 6     public Graph() {
 7         vertices = new ArrayList<String>();
 8         edges = new ArrayList<LinkedList<String>>();
 9     }
10 
11     public void addVertices(String ... vertices) {
12         for (String vertice : vertices) {
13             this.vertices.add(vertice);
14             edges.add(new LinkedList<String>());
15         }
16     }
17 
18     public boolean addEdge(String from, String to, boolean isDirected) {
19         if (! vertices.contains(from)) {
20             System.err.println("起点不存在!");
21             return false;
22         }
23         if (! vertices.contains(to)) {
24             System.err.println("终点不存在!");
25             return false;
26         }
27         edges.get(vertices.indexOf(from)).add(to);
28         if (! isDirected) edges.get(vertices.indexOf(to)).add(from);
29         return true;
30     }
31 
32     @Override
33     public String toString() {
34         String str = "";
35         for (int i = 0; i < vertices.size(); i++) {
36             str += vertices.get(i) + ": ";
37             for (String edge : edges.get(i)) {
38                 str += edge + " ";
39             }
40             str += "\n";
41         }
42         return str;
43     }
44 
45 }
Graph

  其中,vertices表示结点,edges表示边。

图的遍历

  

原文地址:https://www.cnblogs.com/lqkStudy/p/11640704.html