标签:Java int graph public v2 edges 数据结构 之图 insertEdge
六、图
1. 图基本介绍
当我们需要表示多对多的关系时,这里我们就用到了图。
1.1 图的举例说明
图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。
1.2 图的常用概念
1)顶点(vertex)
2)边(edge)
3)路径
4)无向图
5)有向图
6)带权图
1.3 图的表示方式
1.3.1 邻接矩阵
邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1....n个点。
1.3.2 邻接表
1)邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失。
2)邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成。
1.4 图的快速入门案例
思路
(1)存储顶点使用ArrayList
(2)保存矩阵int[][]edges
代码实现
public class Graph {
private ArrayList<Integer> vertexList; // 创建指定节点长度的数组
private int[][] edges; // 存储边的数据
private int edgesNum; // 边的数目
private int weight; // 权重
public static void main(String[] args) {
int n = 8;
int[] vertexs = {1,2,3,4,5,6,7,8};
Graph graph = new Graph(n);
for (int vertex:vertexs) {
graph.insertVertex(vertex);
}
graph.insertEdge(0,1,1);
graph.insertEdge(0,2,1);
graph.insertEdge(1,3,1);
graph.insertEdge(1,4,1);
graph.insertEdge(3,7,1);
graph.insertEdge(4,7,1);
graph.insertEdge(2,5,1);
graph.insertEdge(2,6,1);
graph.insertEdge(5,6,1);
graph.showGraph();
}
public Graph(int n) {
vertexList = new ArrayList<Integer>(n);
edges = new int[n][n];
}
// 返回节点的个数
public int numOfVertex() {
return vertexList.size();
}
// 显示图中的矩阵
public void showGraph() {
for (int[] edge:edges) {
System.out.println(Arrays.toString(edge));
}
}
// 得到边的数目
public int numOfEdges() {
return edgesNum;
}
// 返回节点下标i对应的数组
public int showVertexList(int i) {
return vertexList.get(i);
}
// 返回v1、v2的权值
public int getWeightOfEdge(int v1, int v2) {
return edges[v1][v2];
}
// 插入节点
public void insertVertex(Integer vertex) {
vertexList.add(vertex);
}
// 添加边
public void insertEdge(int v1, int v2, int weight) {
edges[v1][v2] = weight;
edges[v2][v1] = weight;
edgesNum++;
}
}
结果打印:
标签:Java,int,graph,public,v2,edges,数据结构,之图,insertEdge 来源: https://www.cnblogs.com/njuptzheng/p/13325222.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。