package hjelpeklasser;
import java.io.*;
import java.net.URL;
import java.util.*;
public final class VGraf implements Iterable<String>
{
private static final class Kant
{
private final Node til;
private int vekt;
private Kant(Node til, int vekt)
{
this.til = til;
this.vekt = vekt;
}
}
private static final class Node
{
private static final int uendelig = 0x7fffffff;
private final String navn;
private final List<Kant> kanter;
private int avstand = uendelig;
private boolean ferdig = false;
private Node forrige = null;
private Node(String navn)
{
this.navn = navn;
kanter = new LinkedList<>();
}
}
private final Map<String, Node> noder;
public VGraf()
{
noder = new TreeMap<>();
}
public boolean leggInnNode(String navn)
{
if (navn == null) throw new IllegalArgumentException("navn er null!");
if (noder.get(navn) != null) return false;
noder.put(navn, new Node(navn));
return true;
}
public boolean nodeFinnes(String navn)
{
return noder.get(navn) != null;
}
@Override
public Iterator<String> iterator()
{
return noder.keySet().iterator();
}
public String[] nodenavn()
{
return noder.keySet().toArray(new String[0]);
}
public void leggInnKant(String franode, String tilnode, int vekt)
{
if (franode.equals(tilnode)) throw
new IllegalArgumentException(franode + " er lik " + tilnode + "!");
Node fra = noder.get(franode);
if (fra == null) throw new NoSuchElementException(franode + " er ukjent!");
Node til = noder.get(tilnode);
if (til == null) throw new NoSuchElementException(tilnode + " er ukjent!");
for (Kant kant : fra.kanter)
{
if (kant.til == til)
throw new IllegalArgumentException("Kanten finnes fra før!");
}
fra.kanter.add(new Kant(til, vekt));
}
public String kanterFra(String node)
{
Node fra = noder.get(node);
if (fra == null) return node + " er ukjent!";
StringJoiner sj = new StringJoiner(", ");
for (Kant k : fra.kanter) sj.add(k.toString());
return sj.toString();
}
}