数据结构_图(Graph)
1 基本概念
1) 顶点(vertex)
2) 边(edge)
比如从 D -> C 的路径有
1) D->B->C
2) D->A->B->C
4)无向图: 顶点之间的连接没有方向,比如A-B,
即可以是 A-> B 也可以 B->A .
5)有向图
顶点之间的连接有方向,比如A-B,只能是A→B,不能是B→A
6) 带权图
2 图的表示方式
二维数组表示(邻接矩阵);
链表表示(邻接表)
邻接矩阵表示法代码:
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; public class GraphSolution { public static void main(String[] args) { int n = 5; //结点的个数 String[] Vertexes = {"A", "B", "C", "D", "E"}; //创建图对象 Graph graph = new Graph(n); //循环的添加顶点 for(String vertex: Vertexes) { graph.insertVertex(vertex); } //A-B A-C B-C B-D B-E graph.insertEdge(0, 1, 1); // A-B graph.insertEdge(0, 2, 1); // A-C graph.insertEdge(1, 2, 1); // B-C graph.insertEdge(1, 3, 1); // B-D graph.insertEdge(1, 4, 1); // B-E //显示图的邻接矩阵 graph.showGraph(); } } class Graph { private ArrayList<String> vertexList; //存储顶点集合 private int[][] edges; //存储图对应的邻结矩阵 private int numOfEdges; //表示边的数目 //构造器 public Graph(int n) { //初始化矩阵和vertexList edges = new int[n][n]; vertexList = new ArrayList<String>(n); numOfEdges = 0; } //插入结点 public void insertVertex(String vertex) { vertexList.add(vertex); } //添加边 /** * * @param v1 表示点的下标即使第几个顶点 "A"-"B" "A"->0 "B"->1 * @param v2 第二个顶点对应的下标 * @param weight 表示 */ public void insertEdge(int v1, int v2, int weight) { edges[v1][v2] = weight; edges[v2][v1] = weight; numOfEdges++; } //显示图对应的矩阵 public void showGraph() { for(int[] link : edges) { System.out.println(Arrays.toString(link)); } } }
3 图的深度优先遍历
未完待续。。。