aboutsummaryrefslogtreecommitdiff
path: root/src/com.example.portfolio3/com/example/portfolio3/MatrixGraph.java
blob: bd80c0095dded246546f4a8ee570e1541fe863b0 (plain)
  1. package com.example.portfolio3;
  2. // origin: <https://moodle.ruc.dk/course/section.php?id=211877>
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.Map;
  7. /// Matrix Graph: weights are stored in a twodimensional array
  8. public class MatrixGraph extends AbstractGraph {
  9. /// foo
  10. private Integer[][] matrix = null; // made in constructor
  11. /// foo
  12. // We must be able to map vertices
  13. // to index in matrix and back again
  14. private Vertex[] index2vertex; // made in constructor
  15. /// foo
  16. private Map<Vertex, Integer> vertex2index = new HashMap<>();
  17. /// maximum number of vertices
  18. private int numVertex;
  19. /// foo
  20. ///
  21. /// @param numVertex maximum number of vertices allowed
  22. public MatrixGraph(final int numVertex) {
  23. this.numVertex = numVertex;
  24. matrix = new Integer[numVertex][numVertex];
  25. index2vertex = new Vertex[numVertex];
  26. }
  27. /// foo
  28. ///
  29. /// @param v vertex
  30. /// @return int
  31. private int getIndex(final Vertex v) {
  32. if (vertex2index.containsKey(v)) {
  33. return vertex2index.get(v);
  34. }
  35. int index = vertex2index.size();
  36. if (index >= index2vertex.length) {
  37. throw new RuntimeException(
  38. "Too many vertices in graph");
  39. }
  40. vertex2index.put(v, index);
  41. index2vertex[index] = v;
  42. return index;
  43. }
  44. /// foo
  45. public final void insertEdge(
  46. final Vertex v1, final Vertex v2, final int w
  47. ) {
  48. matrix[getIndex(v1)][getIndex(v2)] = w;
  49. }
  50. /// foo
  51. public final Collection<Edge> edges() {
  52. HashSet<Edge> edges = new HashSet<>();
  53. for (int i = 0; i < numVertex; i++) {
  54. for (int j = 0; j < numVertex; j++) {
  55. // may be null
  56. Integer weight = matrix[i][j];
  57. if (weight == null) {
  58. continue;
  59. }
  60. edges.add(new Edge(
  61. index2vertex[i],
  62. index2vertex[j],
  63. weight));
  64. }
  65. }
  66. return edges;
  67. }
  68. /// foo
  69. public final Collection<Edge> outEdge(final Vertex v1) {
  70. HashSet<Edge> edges = new HashSet<>();
  71. int i = vertex2index.get(v1);
  72. for (int j = 0; j < numVertex; j++) {
  73. Integer weight = matrix[i][j]; // may be null
  74. if (weight == null) {
  75. continue;
  76. }
  77. edges.add(new Edge(v1, index2vertex[j], weight));
  78. }
  79. return edges;
  80. }
  81. /// foo
  82. public final Integer getWeight(
  83. final Vertex v1, final Vertex v2
  84. ) {
  85. // constant time operation
  86. return matrix[vertex2index.get(v1)][vertex2index.get(v2)];
  87. }
  88. }