graph.java
来自「JAVA图论的算法包。用过觉得还不错」· Java 代码 · 共 432 行 · 第 1/2 页
JAVA
432 行
/* ==========================================
* JGraphT : a free Java graph-theory library
* ==========================================
*
* Project Info: http://jgrapht.sourceforge.net/
* Project Creator: Barak Naveh (http://sourceforge.net/users/barak_naveh)
*
* (C) Copyright 2003-2007, by Barak Naveh and Contributors.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
/* ----------
* Graph.java
* ----------
* (C) Copyright 2003-2007, by Barak Naveh and Contributors.
*
* Original Author: Barak Naveh
* Contributor(s): John V. Sichi
* Christian Hammer
*
* $Id: Graph.java 568 2007-09-30 00:12:18Z perfecthash $
*
* Changes
* -------
* 24-Jul-2003 : Initial revision (BN);
* 06-Nov-2003 : Change edge sharing semantics (JVS);
* 11-Mar-2004 : Made generic (CH);
* 07-May-2006 : Changed from List<Edge> to Set<Edge> (JVS);
* 28-May-2006 : Moved connectivity info from edge to graph (JVS);
*
*/
package org.jgrapht;
import java.util.*;
/**
* The root interface in the graph hierarchy. A mathematical graph-theory graph
* object <tt>G(V,E)</tt> contains a set <tt>V</tt> of vertices and a set <tt>
* E</tt> of edges. Each edge e=(v1,v2) in E connects vertex v1 to vertex v2.
* for more information about graphs and their related definitions see <a
* href="http://mathworld.wolfram.com/Graph.html">
* http://mathworld.wolfram.com/Graph.html</a>.
*
* <p>This library generally follows the terminology found at: <a
* href="http://mathworld.wolfram.com/topics/GraphTheory.html">
* http://mathworld.wolfram.com/topics/GraphTheory.html</a>. Implementation of
* this interface can provide simple-graphs, multigraphs, pseudographs etc. The
* package <code>org.jgrapht.graph</code> provides a gallery of abstract and
* concrete graph implementations.</p>
*
* <p>This library works best when vertices represent arbitrary objects and
* edges represent the relationships between them. Vertex and edge instances may
* be shared by more than one graph.</p>
*
* Through generics, a graph can be typed to specific classes for vertices
* <code>V</code> and edges <code>E<T></code>. Such a graph can contain
* vertices of type <code>V</code> and all sub-types and Edges of type <code>
* E</code> and all sub-types.
*
* @author Barak Naveh
* @since Jul 14, 2003
*/
public interface Graph<V, E>
{
//~ Methods ----------------------------------------------------------------
/**
* Returns a set of all edges connecting source vertex to target vertex if
* such vertices exist in this graph. If any of the vertices does not exist
* or is <code>null</code>, returns <code>null</code>. If both vertices
* exist but no edges found, returns an empty set.
*
* <p>In undirected graphs, some of the returned edges may have their source
* and target vertices in the opposite order. In simple graphs the returned
* set is either singleton set or empty set.</p>
*
* @param sourceVertex source vertex of the edge.
* @param targetVertex target vertex of the edge.
*
* @return a set of all edges connecting source vertex to target vertex.
*/
public Set<E> getAllEdges(V sourceVertex, V targetVertex);
/**
* Returns an edge connecting source vertex to target vertex if such
* vertices and such edge exist in this graph. Otherwise returns <code>
* null</code>. If any of the specified vertices is <code>null</code>
* returns <code>null</code>
*
* <p>In undirected graphs, the returned edge may have its source and target
* vertices in the opposite order.</p>
*
* @param sourceVertex source vertex of the edge.
* @param targetVertex target vertex of the edge.
*
* @return an edge connecting source vertex to target vertex.
*/
public E getEdge(V sourceVertex, V targetVertex);
/**
* Returns the edge factory using which this graph creates new edges. The
* edge factory is defined when the graph is constructed and must not be
* modified.
*
* @return the edge factory using which this graph creates new edges.
*/
public EdgeFactory<V, E> getEdgeFactory();
/**
* Creates a new edge in this graph, going from the source vertex to the
* target vertex, and returns the created edge. Some graphs do not allow
* edge-multiplicity. In such cases, if the graph already contains an edge
* from the specified source to the specified target, than this method does
* not change the graph and returns <code>null</code>.
*
* <p>The source and target vertices must already be contained in this
* graph. If they are not found in graph IllegalArgumentException is
* thrown.</p>
*
* <p>This method creates the new edge <code>e</code> using this graph's
* <code>EdgeFactory</code>. For the new edge to be added <code>e</code>
* must <i>not</i> be equal to any other edge the graph (even if the graph
* allows edge-multiplicity). More formally, the graph must not contain any
* edge <code>e2</code> such that <code>e2.equals(e)</code>. If such <code>
* e2</code> is found then the newly created edge <code>e</code> is
* abandoned, the method leaves this graph unchanged returns <code>
* null</code>.</p>
*
* @param sourceVertex source vertex of the edge.
* @param targetVertex target vertex of the edge.
*
* @return The newly created edge if added to the graph, otherwise <code>
* null</code>.
*
* @throws IllegalArgumentException if source or target vertices are not
* found in the graph.
* @throws NullPointerException if any of the specified vertices is <code>
* null</code>.
*
* @see #getEdgeFactory()
*/
public E addEdge(V sourceVertex, V targetVertex);
/**
* Adds the specified edge to this graph, going from the source vertex to
* the target vertex. More formally, adds the specified edge, <code>
* e</code>, to this graph if this graph contains no edge <code>e2</code>
* such that <code>e2.equals(e)</code>. If this graph already contains such
* an edge, the call leaves this graph unchanged and returns <tt>false</tt>.
* Some graphs do not allow edge-multiplicity. In such cases, if the graph
* already contains an edge from the specified source to the specified
* target, than this method does not change the graph and returns <code>
* false</code>. If the edge was added to the graph, returns <code>
* true</code>.
*
* <p>The source and target vertices must already be contained in this
* graph. If they are not found in graph IllegalArgumentException is
* thrown.</p>
*
* @param sourceVertex source vertex of the edge.
* @param targetVertex target vertex of the edge.
* @param e edge to be added to this graph.
*
* @return <tt>true</tt> if this graph did not already contain the specified
* edge.
*
* @throws IllegalArgumentException if source or target vertices are not
* found in the graph.
* @throws ClassCastException if the specified edge is not assignment
* compatible with the class of edges produced by the edge factory of this
* graph.
* @throws NullPointerException if any of the specified vertices is <code>
* null</code>.
*
* @see #addEdge(Object, Object)
* @see #getEdgeFactory()
*/
public boolean addEdge(V sourceVertex, V targetVertex, E e);
/**
* Adds the specified vertex to this graph if not already present. More
* formally, adds the specified vertex, <code>v</code>, to this graph if
* this graph contains no vertex <code>u</code> such that <code>
* u.equals(v)</code>. If this graph already contains such vertex, the call
* leaves this graph unchanged and returns <tt>false</tt>. In combination
* with the restriction on constructors, this ensures that graphs never
* contain duplicate vertices.
*
* @param v vertex to be added to this graph.
*
* @return <tt>true</tt> if this graph did not already contain the specified
* vertex.
*
* @throws NullPointerException if the specified vertex is <code>
* null</code>.
*/
public boolean addVertex(V v);
/**
* Returns <tt>true</tt> if and only if this graph contains an edge going
* from the source vertex to the target vertex. In undirected graphs the
* same result is obtained when source and target are inverted. If any of
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?