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