package hu.elte.inf.teralg.graph; import java.util.*; /** * Gráf adatszerkezet * @author Máté Cserép */ public class Graph { private Map> edges; /** * Új, üres gráf létrehozása. */ public Graph() { edges = new HashMap>(); } /** * Csúcs hozzáadása * @param vertex csúcs azonosítója */ public void add(String vertex) { if (!edges.containsKey(vertex)) edges.put(vertex, new HashMap()); } /** * Irányított él hozzáadása vagy módosítása * @param source kiindulási csúcs * @param target cél csúcs * @param cost élköltség */ public void set(String source, String target, Integer cost) { if (!edges.containsKey(source)) add(source); if (!edges.containsKey(target)) add(target); edges.get(source).put(target, cost); } /** * Csúcs létezésének lekérdezése * @param vertex csúcs azonosítója */ public Boolean has(String vertex) { return edges.containsKey(vertex); } /** * Él létezésének lekérdezése * @param source kiindulási csúcs * @param target cél csúcs */ public Boolean has(String source, String target) { return edges.containsKey(source) && edges.get(source).containsKey(target); } /** * Élköltség lekérdezése * @param source kiindulási csúcs * @param target cél csúcs * @return élköltség */ public Integer get(String source, String target) { if (!has(source, target)) throw new IndexOutOfBoundsException("No edge between '" + source + "' and '" + target + "' found."); return edges.get(source).get(target); } /** * Csúcs eltávolítása * @param vertex csúcs azonosítója */ public void remove(String vertex) { edges.remove(vertex); for(Map edge : edges.values()) { edge.remove(vertex); } } /** * Él eltávolítása * @param source kiindulási csúcs * @param target cél csúcs */ public void remove(String source, String target) { if(has(source)) edges.get(source).remove(target); } /** * Csúcs szomszédainak lekérdezése * @param vertex csúcs azonosítója * @return Szomszédok halmaza */ public Set neighbours(String vertex) { if (!has(vertex)) throw new IndexOutOfBoundsException("No vertex '" + vertex + "' found."); return edges.get(vertex).keySet(); } }