diff --git a/.idea/misc.xml b/.idea/misc.xml index 8f5f4fa549573976cd9b187a51b9401fa3f5c8ce..8a372ca66dc08d0ac8c086ac1ded906b9b4f1bb2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> - <component name="ProjectRootManager" version="2" languageLevel="JDK_13" default="false" project-jdk-name="13" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_13" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/out" /> </component> </project> \ No newline at end of file diff --git a/src/Graph/Arc.java b/src/Graph/Arc.java index 7de560849042aa128cddfe1242c4b5e808cf4735..1b7916042769d03b9282fc02d481adce9a9f0b3c 100644 --- a/src/Graph/Arc.java +++ b/src/Graph/Arc.java @@ -3,18 +3,18 @@ package Graph; public class Arc { public Edge support; boolean reversed; - + public Arc(Edge e, boolean reversed) { this.support = e; this.reversed = reversed; } - + public int getSource() { return (reversed ? support.getDest() : support.getSource()); } - + public int getDest() { return (reversed ? support.getSource() : support.getDest()); } - + } diff --git a/src/Graph/Graph.java b/src/Graph/Graph.java index bffae38e031085845c449bd156582a9fee54f0c6..383b0b9b1017fb548676495aec7fdb5ec9badd40 100644 --- a/src/Graph/Graph.java +++ b/src/Graph/Graph.java @@ -27,42 +27,97 @@ public class Graph { // par suppression de sommet, ou l'opération de contraction d’arête. // Autrement, on pourra asssumer que upperBound==order. - // à compléter + this.upperBound = upperBound; + this.order = 0; + this.edgeCardinality = 0; + + this.incidency = new ArrayList<>(upperBound); + this.inIncidency = new ArrayList<>(upperBound); + this.outIncidency = new ArrayList<>(upperBound); + + for (int i = 0; i < upperBound; i++) { + incidency.add(new LinkedList<>()); + inIncidency.add(new LinkedList<>()); + outIncidency.add(new LinkedList<>()); + } } public boolean isVertex(int vertex) { // Après avori supprimé certains sommets // pas tous le sommets numerotés 0,...,n-1 sont 'vivant'. - // à compléter - return true; + return vertex >= 0 && vertex < order && incidency.get(vertex) != null; } public void addVertex(int vertex) { - // à compléter + if (vertex >= upperBound) { + throw new IllegalArgumentException("Sommet hors limites."); + } + while (incidency.size() <= vertex) { + incidency.add(new LinkedList<>()); + inIncidency.add(new LinkedList<>()); + outIncidency.add(new LinkedList<>()); + } + order = Math.max(order, vertex + 1); } - public void deleteVertex(int vertex){ - // à compléter + + public void deleteVertex(int vertex) { + if (vertex >= incidency.size() || incidency.get(vertex) == null) { + throw new IllegalArgumentException("Sommet inexistant."); + } + for (Edge edge : incidency.get(vertex)) { + int other = edge.oppositeExtremity(vertex); + incidency.get(other).remove(edge); + } + incidency.set(vertex, null); + inIncidency.set(vertex, null); + outIncidency.set(vertex, null); } - public void ensureVertex(int vertex) { - // Synonime de addVertex ? - // à compléter + public void ensureVertex(int vertex) { + if (vertex >= upperBound) { + throw new IllegalArgumentException("Sommet hors limites."); + } + if(incidency.size() <= vertex){ + addVertex(vertex); + } } public void addArc(Arc arc) { - // à compléter + int source = arc.getSource(); + int dest = arc.getDest(); + + ensureVertex(source); + ensureVertex(dest); + + outIncidency.get(source).add(arc); + inIncidency.get(dest).add(arc); } + public void addEdge(Edge edge) { - // à compléter + int source = edge.getSource(); + int dest = edge.getDest(); + + addVertex(source); + addVertex(dest); + + incidency.get(source).add(edge); + incidency.get(dest).add(edge); + + addArc(new Arc(edge, false)); + addArc(new Arc(edge, true)); + + edgeCardinality++; } - public Arc[] outEdges(int vertex) { - // à modifier, si nécessaire + public Arc[] outEdges(int vertex) { + if (!isVertex(vertex)) { + throw new IllegalArgumentException("Sommet inexistant."); + } // Pour la prochaine ligne voir // https://www.baeldung.com/java-collection-toarray-methods return outIncidency.get(vertex).toArray(new Arc[0]);