分析

题目:构造无向图如下

image.png

说明
(1) 存储顶点String 使用 ArrayList
(2) 保存矩阵 int[][] edges

编写程序,输出为邻接矩阵如下:

image.png
说明
(1) 1 表示能够直接连接
(2) 0 表示不能直接连接

代码实现

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. public class Graph {
  4. private ArrayList<String> vertexList; // 存储顶点集合
  5. private int[][] edges; // 存储图对应的邻结矩阵
  6. private int numOfEdges; // 表示边的数目
  7. // 构造器,初始化矩阵和vertexList
  8. public Graph(int n) {
  9. edges = new int[n][n];
  10. vertexList = new ArrayList<String>(n);
  11. numOfEdges = 0;
  12. }
  13. // 返回顶点的个数
  14. public int getNumOfVertex() {
  15. return vertexList.size();
  16. }
  17. // 得到边的数目
  18. public int getNumOfEdges() {
  19. return numOfEdges;
  20. }
  21. // 返回结点i(下标)对应的顶点 0->"A" 1->"B" 2->"C"
  22. public String getValueByIndex(int i) {
  23. return vertexList.get(i);
  24. }
  25. // 返回v1和v2的权值
  26. public int getWeight(int v1, int v2) {
  27. return edges[v1][v2];
  28. }
  29. // 显示图对应的矩阵
  30. public void showGraph() {
  31. for (int[] link : edges) {
  32. System.err.println(Arrays.toString(link));
  33. }
  34. }
  35. // 插入结点
  36. public void insertVertex(String vertex) {
  37. vertexList.add(vertex);
  38. }
  39. // 添加边
  40. /**
  41. * @param v1 表示点的下标即使第几个顶点 "A"-"B" "A"->0 "B"->1
  42. * @param v2 第二个顶点对应的下标
  43. * @param weight 表示权重
  44. */
  45. public void insertEdge(int v1, int v2, int weight) {
  46. // 因为构建的是无向图,所以这里直接设置顶点之间的双向边
  47. edges[v1][v2] = weight;
  48. edges[v2][v1] = weight;
  49. numOfEdges++;
  50. }
  51. public static void main(String[] args) {
  52. // 顶结点的个数
  53. int n = 5;
  54. String Vertexs[] = { "A", "B", "C", "D", "E" };
  55. // 创建图对象
  56. Graph graph = new Graph(n);
  57. // 循环的添加顶点
  58. for (String vertex : Vertexs) {
  59. graph.insertVertex(vertex);
  60. }
  61. // 添加边
  62. // A-B A-C B-C B-D B-E
  63. graph.insertEdge(0, 1, 1); // A-B
  64. graph.insertEdge(0, 2, 1); //
  65. graph.insertEdge(1, 2, 1); //
  66. graph.insertEdge(1, 3, 1); //
  67. graph.insertEdge(1, 4, 1); //
  68. // 获取顶点的个数
  69. System.out.println("顶点个数:"+graph.getNumOfVertex());
  70. // 获取边的数目
  71. System.out.println("边个数:"+graph.getNumOfEdges());
  72. // 获取结点i(下标)对应的顶点 0->"A" 1->"B" 2->"C"
  73. System.out.println("结点下标对应的顶点:"+graph.getValueByIndex(1));
  74. // 获取v1和v2的权值
  75. System.out.println("权值:"+graph.getWeight(1,2));
  76. // 显示邻结矩阵
  77. graph.showGraph();
  78. }
  79. }