图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。
图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。
邻接矩阵
邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1....n个点。
邻接表
1)邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失.
邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成
package com.zhen;
import java.util.ArrayList;
import java.util.Arrays;
public class Graph {
//存放顶点
private ArrayList<String> dot;
//存放邻接矩阵
private int[][] edge;
//边的数量
private int count=0;
public static void main(String[] args) {
int n=5;
String[] dot= {"A","B","C","D","E"};
Graph graph = new Graph(5);
//添加点
for(String s:dot) {
graph.addDot(s);
}
//添加边
graph.adddEdge(0, 1, 1);
graph.adddEdge(0, 2, 1);
graph.adddEdge(1, 2, 1);
graph.adddEdge(1, 3, 1);
graph.adddEdge(1, 4, 1);
graph.show();
}
//初始化
public Graph(int n) {
edge=new int[n][n];
dot = new ArrayList<String>(n);
}
//插入节点
public void addDot(String s) {
dot.add(s);
}
/**
* 添加边
* @param row 行节点的下标
* @param col 列节点的下标
* @param value 权值
*/
public void adddEdge(int row,int col,int value) {
edge[row][col]=value;
edge[col][row]=value;
count++;
}
//获取节点个数
public int getDotNum() {
return dot.size();
}
//获取边的数目
public int getEdgeNum() {
return count;
}
//返回节点i(下标)对应的点名称 0->A,1->B,2->C...
public String getS(int i) {
return dot.get(i);
}
//返回权值
public int getValue(int row,int col) {
return edge[row][col];
}
//显示图对应的矩阵
public void show() {
for(int[] link:edge) {
System.out.println(Arrays.toString(link));
}
}
}