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
Metodeniterator() 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; }