// Path: src/de/jungblut/graph/model/Edge.java
// public final class Edge<VERTEX_ID, EDGE_VALUE> {
// 
//     private final VERTEX_ID destinationVertexID;
//     private final EDGE_VALUE cost;
// 
//     public Edge(VERTEX_ID destinationVertexID, EDGE_VALUE cost) {
//         this.destinationVertexID = destinationVertexID;
//         this.cost = cost;
//     }
// 
//     public VERTEX_ID getDestinationVertexID() {
//         return destinationVertexID;
//     }
// 
//     public EDGE_VALUE getValue() {
//         return cost;
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = prime
//                 * result
//                 + ((this.destinationVertexID == null) ? 0 : this.destinationVertexID
//                 .hashCode());
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         @SuppressWarnings("rawtypes")
//         Edge other = (Edge) obj;
//         if (this.destinationVertexID == null) {
//             if (other.destinationVertexID != null)
//                 return false;
//         } else if (!this.destinationVertexID.equals(other.destinationVertexID))
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return this.destinationVertexID + ":" + this.getValue();
//     }
// 
// }
// 
// Path: src/de/jungblut/graph/model/Vertex.java
// public interface Vertex<VERTEX_ID, VERTEX_VALUE> {
// 
//     /**
//      * @return the id of this vertex.
//      */
//     VERTEX_ID getVertexId();
// 
//     /**
//      * @return the value of this vertex.
//      */
//     VERTEX_VALUE getVertexValue();
// 
// }
// 
// Path: src/de/jungblut/graph/model/VertexImpl.java
// public final class VertexImpl<VERTEX_ID, VERTEX_VALUE> implements
//         Vertex<VERTEX_ID, VERTEX_VALUE> {
// 
//     private final VERTEX_ID id;
//     private final VERTEX_VALUE value;
// 
//     public VertexImpl(VERTEX_ID id, VERTEX_VALUE value) {
//         super();
//         this.id = id;
//         this.value = value;
//     }
// 
//     @Override
//     public VERTEX_ID getVertexId() {
//         return id;
//     }
// 
//     @Override
//     public VERTEX_VALUE getVertexValue() {
//         return value;
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         @SuppressWarnings("rawtypes")
//         VertexImpl other = (VertexImpl) obj;
//         if (this.id == null) {
//             if (other.id != null)
//                 return false;
//         } else if (!this.id.equals(other.id))
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "VertexImpl [id=" + this.id + ", value=" + this.value + "]";
//     }
// 
// }


import com.google.common.collect.HashMultimap;
import com.google.common.collect.Sets;
import de.jungblut.graph.model.Edge;
import de.jungblut.graph.model.Vertex;
import de.jungblut.graph.model.VertexImpl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
package de.jungblut.graph;



/**
 * Adjacency list implementation for sparse graphs like the webgraph. This is
 * simply implemented by a backing {@link HashMultimap}.
 *
 * @param <VERTEX_ID>    the vertex id type.
 * @param <VERTEX_VALUE> the vertex value type.
 * @param <EDGE_VALUE>   the edge value type.
 * @author thomas.jungblut
 */
public final class AdjacencyList<VERTEX_ID, VERTEX_VALUE, EDGE_VALUE>
        implements Graph<VERTEX_ID, VERTEX_VALUE, EDGE_VALUE> {

    private final HashSet<Vertex<VERTEX_ID, VERTEX_VALUE>> vertexSet = new HashSet<>();
    private final HashMap<VERTEX_ID, Vertex<VERTEX_ID, VERTEX_VALUE>> vertexMap = new HashMap<>();
    private final HashMultimap<VERTEX_ID, VERTEX_ID> adjacencyMultiMap = HashMultimap
            .create();
    private final HashMultimap<VERTEX_ID, Edge<VERTEX_ID, EDGE_VALUE>> edgeMultiMap = HashMultimap
            .create();

    @Override
    public Set<Vertex<VERTEX_ID, VERTEX_VALUE>> getAdjacentVertices(
            VERTEX_ID vertexId) {
        Set<VERTEX_ID> set = adjacencyMultiMap.get(vertexId);
// Path: src/de/jungblut/graph/model/Edge.java
// public final class Edge<VERTEX_ID, EDGE_VALUE> {
// 
//     private final VERTEX_ID destinationVertexID;
//     private final EDGE_VALUE cost;
// 
//     public Edge(VERTEX_ID destinationVertexID, EDGE_VALUE cost) {
//         this.destinationVertexID = destinationVertexID;
//         this.cost = cost;
//     }
// 
//     public VERTEX_ID getDestinationVertexID() {
//         return destinationVertexID;
//     }
// 
//     public EDGE_VALUE getValue() {
//         return cost;
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = prime
//                 * result
//                 + ((this.destinationVertexID == null) ? 0 : this.destinationVertexID
//                 .hashCode());
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         @SuppressWarnings("rawtypes")
//         Edge other = (Edge) obj;
//         if (this.destinationVertexID == null) {
//             if (other.destinationVertexID != null)
//                 return false;
//         } else if (!this.destinationVertexID.equals(other.destinationVertexID))
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return this.destinationVertexID + ":" + this.getValue();
//     }
// 
// }
// 
// Path: src/de/jungblut/graph/model/Vertex.java
// public interface Vertex<VERTEX_ID, VERTEX_VALUE> {
// 
//     /**
//      * @return the id of this vertex.
//      */
//     VERTEX_ID getVertexId();
// 
//     /**
//      * @return the value of this vertex.
//      */
//     VERTEX_VALUE getVertexValue();
// 
// }
// 
// Path: src/de/jungblut/graph/model/VertexImpl.java
// public final class VertexImpl<VERTEX_ID, VERTEX_VALUE> implements
//         Vertex<VERTEX_ID, VERTEX_VALUE> {
// 
//     private final VERTEX_ID id;
//     private final VERTEX_VALUE value;
// 
//     public VertexImpl(VERTEX_ID id, VERTEX_VALUE value) {
//         super();
//         this.id = id;
//         this.value = value;
//     }
// 
//     @Override
//     public VERTEX_ID getVertexId() {
//         return id;
//     }
// 
//     @Override
//     public VERTEX_VALUE getVertexValue() {
//         return value;
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (obj == null)
//             return false;
//         if (getClass() != obj.getClass())
//             return false;
//         @SuppressWarnings("rawtypes")
//         VertexImpl other = (VertexImpl) obj;
//         if (this.id == null) {
//             if (other.id != null)
//                 return false;
//         } else if (!this.id.equals(other.id))
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "VertexImpl [id=" + this.id + ", value=" + this.value + "]";
//     }
// 
// }


// Path: src/de/jungblut/graph/AdjacencyList.java
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Sets;
import de.jungblut.graph.model.Edge;
import de.jungblut.graph.model.Vertex;
import de.jungblut.graph.model.VertexImpl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

package de.jungblut.graph;



/**
 * Adjacency list implementation for sparse graphs like the webgraph. This is
 * simply implemented by a backing {@link HashMultimap}.
 *
 * @param <VERTEX_ID>    the vertex id type.
 * @param <VERTEX_VALUE> the vertex value type.
 * @param <EDGE_VALUE>   the edge value type.
 * @author thomas.jungblut
 */
public final class AdjacencyList<VERTEX_ID, VERTEX_VALUE, EDGE_VALUE>
        implements Graph<VERTEX_ID, VERTEX_VALUE, EDGE_VALUE> {

    private final HashSet<Vertex<VERTEX_ID, VERTEX_VALUE>> vertexSet = new HashSet<>();
    private final HashMap<VERTEX_ID, Vertex<VERTEX_ID, VERTEX_VALUE>> vertexMap = new HashMap<>();
    private final HashMultimap<VERTEX_ID, VERTEX_ID> adjacencyMultiMap = HashMultimap
            .create();
    private final HashMultimap<VERTEX_ID, Edge<VERTEX_ID, EDGE_VALUE>> edgeMultiMap = HashMultimap
            .create();

    @Override
    public Set<Vertex<VERTEX_ID, VERTEX_VALUE>> getAdjacentVertices(
            VERTEX_ID vertexId) {
        Set<VERTEX_ID> set = adjacencyMultiMap.get(vertexId);
        Set<Vertex<VERTEX_ID, VERTEX_VALUE>> toReturn = Sets.newHashSet();