要求: 代码实现如下图结构
使用临界矩阵效果如下:
思路分析
- 存储顶点String 使用 ArrayList
- 保存矩阵 int[][] edges
代码实现:
public class Graph {
public static void main(String[] args) {
// 测试图是否创建
int n = 5;
String[] vertexValue= {"A","B","C","D","E"};
// 创建图对象
Graph graph = new Graph(n);
for (String value : vertexValue) {
graph.insertVertex(value);
}
// 添加边A-B
graph.insertEdge(0,1,1);
// 添加边A-C
graph.insertEdge(0,2,1);
// 添加边B-C
graph.insertEdge(1,2,1);
// 添加边B-D
graph.insertEdge(1,3,1);
// 添加边B-E
graph.insertEdge(1,4,1);
graph.showGraph();
}
/**
* 存储顶点的集合
*/
private ArrayList<String> vertexList;
/**
* 存储图对应的相邻矩阵
*/
private int[][] edges;
/**
* 表示边的数目
*/
private int numOfEdges;
/**
* 图的类的构造器
* @param n 表示顶点的个数
*/
public Graph(int n){
// 初始化矩阵和vertexList
edges = new int[n][n];
vertexList = new ArrayList<String>(n);
// 初始化边的数目为0
numOfEdges = 0;
}
/**
* 获取当前图中结点的个数
* @return
*/
public int getNumOfVertex(){
return vertexList.size();
}
/**
* 获取当前图中边的个数
* @return
*/
public int getNumOfEdges(){
return numOfEdges;
}
/**
* 根据索引返回对应的顶点数据
* @param i
* @return
*/
public String getValueByIndex(int i){
return vertexList.get(i);
}
/**
* 返回对应下标中的边的权值
* @param v1
* @param v2
* @return
*/
public int getWeight(int v1,int v2){
return edges[v1][v2];
}
/**
* 显示当前矩阵
*/
public void showGraph(){
for (int[] link : edges) {
System.out.println(Arrays.toString(link));
}
}
/**
* 添加结点的方法
* @param vertex
*/
public void insertVertex(String vertex){
vertexList.add(vertex);
}
/**
* 添加边的方法,将边使用二维数组表示
* @param v1 顶点1对应的下标
* @param v2 顶点2对应的下标
* @param weight 权值:如果顶点1和顶点2之间存在边,那么权值为1,反之为0
*/
public void insertEdge(int v1,int v2,int weight){
edges[v1][v2] = weight;
edges[v2][v1] = weight;
// 边的数量+1
numOfEdges++;
}
}