Løsningsforslag - oppgaver i Avsnitt 11.1.3


Oppgave 2

  MGraf graf = new MGraf(0);  // starter med tomme tabeller
  String[] navn = "ABEGFCD".split("");  // usortert rekkefølge
  for (String n : navn) graf.leggInnNode(n);  // legger inn
  System.out.println(Arrays.toString(graf.nodenavn()));  // [A, B, C, D, E, F, G]

  graf.leggInnKanter("A",  "B","C","D");              // fra A til B,C,D
  graf.leggInnKanter("B",  "A","D","E");              // fra B til A,D,E
  graf.leggInnKanter("C",  "A","D","F");              // fra C til A,D,F
  graf.leggInnKanter("D",  "A","B","C","E","F","G");  // fra D tilA,B,C,E,F,G
  graf.leggInnKanter("E",  "B","D","G");              // fra E til B,D,G
  graf.leggInnKanter("F",  "C","D","G");              // fra F til C,D,G
  graf.leggInnKanter("G",  "D","E","F");              // fra G til D,E,F

  for (String n : graf.nodenavn())
  {
    System.out.println(n + "-> " + graf.kanterFra(n));
  }

Oppgave 4

Metoden iterator() i klassen Graf bruker en iterator fra TreeMap. Men her i MGraf lager vi all den interne datastrukturen selv. Det betyr at vi må lage vår egen iterator. Flg. klasse (og metoden nedenfor) hører til MGraf. Med det kan iteratorteknikken brukes.
  private class MGrafIterator implements Iterator<String>  // hører til MGraf
  {
    private int denne = 0;       // instansvariabel

    public boolean hasNext()     // sjekker om det er flere igjen
    {
      return denne < antall;     // sjekker verdien til denne
    }

    public String next()         // returnerer aktuell verdi
    {
      if (!hasNext())
        throw new NoSuchElementException("Tomt eller ingen verdier igjen!");
      return snavn[denne++];
    }
  }  // MGrafIterator  

  public Iterator<String> iterator()   // hører til MGraf
  {
    return new MGrafIterator();
  }

Oppgave 5

  public void skrivGraf(String filnavn) throws IOException
  {
    PrintWriter ut = new PrintWriter(filnavn);

    for (int i = 0; i < antall; i++)
    {
      ut.print(snavn[i]);

      int rad = indeks[i];
      for (int kolonne = 0; kolonne < antall; kolonne++)
      {
        if (graf[rad][kolonne]) ut.print(" " + navn[kolonne]);
      }
      ut.println();
    }

Oppgave 6

  public boolean erIsolert(String nodenavn)
  {
    int is = finn(nodenavn);  // indeks i sortert navnetabell
    if (is < 0) throw new NoSuchElementException(nodenavn + " er ukjent!");

    int k = indeks[is];  // tilhørende rad og kolonne i metrisen
    for (int i = 0; i < antall; i++) if (graf[k][i]) return false;  // rad k
    for (int j = 0; j < antall; j++) if (graf[j][k]) return false;  // kolonne k

    return true;
  }

  public boolean erKant(String franode, String tilnode)
  {
    int i = finn(franode);  // indeks i sortert navnetabell
    if (i < 0) throw new IllegalArgumentException(franode + " er ukjent!");

    int j = finn(tilnode);  // indeks i sortert navnetabell
    if (j < 0) throw new IllegalArgumentException(franode + " er ukjent!");

    return graf[indeks[i]][indeks[j]];
  }

  public int grad(String nodenavn)
  {
    int i = finn(nodenavn);  // indeks i sortert navnetabell
    if (i < 0) throw new IllegalArgumentException(nodenavn + " er ukjent!");

    int rad = indeks[i];
    int grad = 0;

    for (boolean harKryss : graf[rad]) if (harKryss) grad++;

    return grad;
  }

  public String[] kantTabellFra(String node)
  {
    int i = finn(node);  // indeks i sortert navnetabell
    if (i < 0) throw new IllegalArgumentException(node + " er ukjent!");

    int rad = indeks[i];

    String[] tabell = new String[antall];

    int ant = 0;
    for (int kolonne = 0; kolonne < antall; kolonne++)
    {
      if (graf[rad][kolonne]) tabell[ant++] = navn[kolonne];
    }

    return Arrays.copyOf(tabell, ant);
  }

  public String kanterTil(String node)
  {
    int i = finn(node);  // indeks i sortert navnetabell
    if (i < 0) throw new IllegalArgumentException(node + " er ukjent!");

    int kolonne = indeks[i];

    StringJoiner sj = new StringJoiner(", ", "[", "]");

    for (int rad = 0; rad < antall; rad++)
    {
      if (graf[rad][kolonne]) sj.add(navn[rad]);
    }

    return sj.toString();
  }

  public String[] kantTabellTil(String node)
  {
    int i = finn(node);  // indeks i sortert navnetabell
    if (i < 0) throw new IllegalArgumentException(node + " er ukjent!");

    int kolonne = indeks[i];

    String[] tabell = new String[antall];

    int ant = 0;
    for (int rad = 0; rad < antall; rad++)
    {
      if (graf[rad][kolonne]) tabell[ant++] = navn[rad];
    }

    return Arrays.copyOf(tabell, ant);
  }

Oppgave 7

Dette er samme som å sjekke at den boolske matrisen graf er symmetrisk:

  public boolean erUrettet()
  {
    for (int i = 0; i < antall; i++)  // nedover
    {
      for (int j = 0; j < i; j++)
      {
        if (graf[i][j] != graf[j][i]) return false;
      }
    }

    return true;
  }