1.图的简介
1.基础介绍
图作为一种数据结构,其中的节点可以具有零个或者多个相邻元素,两个节点的连线称为边
2.图片展示
3.为什么要有图?
根据前面了解的知识,学习了线性表和树。就线性表而言,局限于一个直接前驱和一个直接后继的关系;对于树而言,也只能有一个直接前驱(表示一对多的关系),所以无论是线性表或者是树存在着一定的局限性。所以如果需要表示多对多的关系时,可以使用图。
4.图的几个基础概念(就着上图解释一波)
顶点(vertex): 就是上图中的A B C D E点,在代码中我们可以使用一定的数据结构将其整理
边(edge): AB,AC ...的连线,在代码中我们可以使用二维数组来的两个坐标表示边
权值(weight): 在图的边可以附上一定的值,在代码中我们可以使用二维数组的值表示权值
无向图: 顶点之间的连接是无方向的,比如A-B 可以是A->B 也可以是B->A
扫描二维码关注公众号,回复:
9322803 查看本文章
有向图: 顶点之间的连接是有方向的,比如A->B 和 B->A是不同的
带权图: 边是带有权值的,也被称为网
2.图的表示方法
1.如何表示图
图的表示方法有两种,一种是二维数组表示(邻接矩阵),一种是链表表示(邻接表)
2.邻接矩阵的表示思路:
(1):变量定义
//存储顶点的集合
private static ArrayList<String> vertexList;
//二维数组存储矩阵
private int[][]edges;//存储图对应的邻接矩阵
private static int numOfEdges;//边的数目
//定义数组boolean[]记录某个节点是否被访问过
private static boolean []isVisited;
(2):方法设计
//开始初始化
public Graph(int n){
//初始化矩阵和ArrayList
//如果有n个节点,说明矩阵为n*n的
edges=new int[n][n];
//设置存储节点的链表
vertexList=new ArrayList<String>(n);
//初始化边的个数 默认为0
numOfEdges=0;
isVisited=new boolean[n];
}
/**
* 图中常用的方法
* */
//1.返回节点的个数
public int getNumOfVertex(){
return vertexList.size();
}
//2.得到边的数目
public int getNumOfEdges(){
return numOfEdges;
}
//3.返回节点i(下标)对应的下标 0->"A" 1->"B" 2->"C"
public String getValueByIndex(int i){
return vertexList.get(i);
}
//4.返回边的权值
public int getWeight(int v1,int v2){
return edges[v1][v2];
}
//5.显示图对应的矩阵
public void showGraph(){
//遍历二维数组
for(int []link:edges){
System.out.println(Arrays.toString(link));
}
}
/**
主方法测试
*/
public static void main(String[] args) {
//测试图
int n=5;
String Vertexs[]={"A","B","C","D","E"};
//创建图对象
Graph graph = new Graph(n);
//循环添加节点
for(String vertex:Vertexs){
graph.insertVertex(vertex);
}
//为0
System.out.println("节点信息"+vertexList);
//添加边
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();
}
测试结果: