package hjelpeklasser;
import java.util.*;
import java.io.*;
import java.net.URL;
public final class MGraf
{
private boolean[][] graf;
private int antall;
private String[] navn;
private String[] snavn;
private int[] indeks;
private int[] forrige;
public MGraf(int dimensjon)
{
graf = new boolean[dimensjon][dimensjon];
antall = 0;
navn = new String[dimensjon];
snavn = new String[dimensjon];
indeks = new int[dimensjon];
}
public MGraf()
{
this(10);
}
public int antallNoder()
{
return antall;
}
public int dimensjon()
{
return graf.length;
}
public String[] nodenavn()
{
return Arrays.copyOf(snavn, antall);
}
private int finn(String nodenavn)
{
return Arrays.binarySearch(snavn, 0, antall, nodenavn);
}
public boolean nodeFinnes(String nodenavn)
{
return finn(nodenavn) >= 0;
}
private void utvid()
{
int nydimensjon = graf.length == 0 ? 1 : 2*graf.length;
navn = Arrays.copyOf(navn, nydimensjon);
snavn = Arrays.copyOf(snavn, nydimensjon);
indeks = Arrays.copyOf(indeks, nydimensjon);
boolean[][] gammelgraf = graf;
graf = new boolean[nydimensjon][nydimensjon];
for (int i = 0; i < antall; i++)
{
System.arraycopy(gammelgraf[i], 0, graf[i], 0, antall);
}
}
public boolean leggInnNode(String nodenavn)
{
if (navn == null || nodenavn.length() == 0)
throw new IllegalArgumentException("Noden må ha et navn!");
int rad = finn(nodenavn);
if (rad >= 0) return false;
if (antall >= graf.length) utvid();
rad = -(rad + 1);
for (int i = antall; i > rad; i--)
{
snavn[i] = snavn[i - 1];
indeks[i] = indeks[i - 1];
}
snavn[rad] = nodenavn;
navn[antall] = nodenavn;
indeks[rad] = antall;
antall++;
return true;
}
public void leggInnKant(String franode, String tilnode)
{
if (franode.equals(tilnode)) throw
new IllegalArgumentException(franode + " er lik " + tilnode + "!");
int i = finn(franode);
if (i < 0) throw new NoSuchElementException(franode + " er ukjent!");
int j = finn(tilnode);
if (j < 0) throw new NoSuchElementException(tilnode + " er ukjent!");
int rad = indeks[i];
int kolonne = indeks[j];
if (graf[rad][kolonne]) throw
new IllegalArgumentException("Kanten finnes fra før!");
graf[rad][kolonne] = true;
}
public void leggInnKanter(String franode, String... tilnoder)
{
for (String tilnode : tilnoder) leggInnKant(franode, tilnode);
}
public MGraf(String url) throws IOException
{
this();
BufferedReader inn = new BufferedReader
(new InputStreamReader((new URL(url)).openStream()));
String linje;
while ((linje = inn.readLine()) != null)
{
String[] nodenavn = linje.split(" ");
leggInnNode(nodenavn[0]);
for (int i = 1; i < nodenavn.length; i++)
{
leggInnNode(nodenavn[i]);
leggInnKant(nodenavn[0], nodenavn[i]);
}
}
inn.close();
}
public String kanterFra(String nodenavn)
{
int i = finn(nodenavn);
if (i < 0) return null;
int rad = indeks[i];
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (int kolonne = 0; kolonne < antall; kolonne++)
if (graf[rad][kolonne] == true) sj.add(navn[kolonne]);
return sj.toString();
}
}