1 /*--------------------------------------------------------------------------
\r
2 * Copyright 2008 Taro L. Saito
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
15 *--------------------------------------------------------------------------*/
\r
16 //--------------------------------------
\r
20 // Since: Oct 24, 2008 11:03:03 AM
\r
22 // $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/graph/GraphHelper.java $
\r
24 //--------------------------------------
\r
25 package org.xerial.util.graph;
\r
28 * A helper class to implement graph related methods
\r
35 public class GraphHelper
\r
38 * Prohibit construction
\r
40 private GraphHelper()
\r
43 public static <NodeLabel, EdgeLabel> NodeLabel getSourceNodeLabel(Graph<NodeLabel, EdgeLabel> graph, Edge edge)
\r
45 return graph.getNodeLabel(edge.getSourceNodeID());
\r
48 public static <NodeLabel, EdgeLabel> NodeLabel getDestNodeLabel(Graph<NodeLabel, EdgeLabel> graph, Edge edge)
\r
50 return graph.getNodeLabel(edge.getDestNodeID());
\r
53 public static <NodeLabel, EdgeLabel> String toString(Graph<NodeLabel, EdgeLabel> graph, Edge edge)
\r
55 return String.format("(%s,%s)", graph.getNodeLabel(edge.getSourceNodeID()).toString(), graph.getNodeLabel(
\r
56 edge.getDestNodeID()).toString());
\r
60 * compute the transitive closure of the input graph
\r
62 * @param <NodeLabel>
\r
63 * @param <EdgeLabel>
\r
67 public static <NodeLabel, EdgeLabel> Graph<NodeLabel, EdgeLabel> transitiveClosure(Graph<NodeLabel, EdgeLabel> input)
\r
69 Graph<NodeLabel, EdgeLabel> graph = AdjacencyList.copy(input);
\r
75 for (NodeLabel from : graph.getNodeLabelSet())
\r
77 for (NodeLabel to : graph.getNodeLabelSet())
\r
79 if (graph.hasEdge(from, to))
\r
82 int destNodeID = graph.getNodeID(to);
\r
83 for (Edge startPoint : graph.getOutEdgeSet(from))
\r
85 int intermediateNodeID = startPoint.getDestNodeID();
\r
87 if (graph.hasEdge(new Edge(intermediateNodeID, destNodeID)))
\r
89 graph.addEdge(from, to);
\r
97 while (numChange > 0);
\r