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; }