KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jgrapht > experimental > GraphTests


1 package org.jgrapht.experimental;
2
3 import java.util.*;
4
5 import org.jgrapht.*;
6
7
8 public final class GraphTests<V, E>
9 {
10
11     //~ Constructors ----------------------------------------------------------
12

13     private GraphTests()
14     {
15     }
16
17     //~ Methods ---------------------------------------------------------------
18

19     public static <V, E> boolean isEmpty(Graph<V, E> g)
20     {
21         return g.edgeSet().isEmpty();
22     }
23
24     public static <V, E> boolean isComplete(Graph<V, E> g)
25     {
26         int n = g.vertexSet().size();
27         return g.edgeSet().size()
28             == (n * (n - 1) / 2);
29     }
30
31     public static <V, E> boolean isConnected(Graph<V, E> g)
32     {
33         int numVertices = g.vertexSet().size();
34         int numEdges = g.edgeSet().size();
35
36         if (numEdges < (numVertices - 1)) {
37             return false;
38         }
39         if (
40             (numVertices < 2)
41             || (numEdges > ((numVertices - 1) * (numVertices - 2) / 2))) {
42             return true;
43         }
44
45         Set<V> known = new HashSet<V>();
46         LinkedList<V> queue = new LinkedList<V>();
47         V v = g.vertexSet().iterator().next();
48
49         queue.add(v); // start with node 1
50
known.add(v);
51
52         while (!queue.isEmpty()) {
53             v = queue.removeFirst();
54             for (
55                 Iterator<V> it = Graphs.neighborListOf(g, v).iterator();
56                 it.hasNext();) {
57                 v = it.next();
58                 if (!known.contains(v)) {
59                     known.add(v);
60                     queue.add(v);
61                 }
62             }
63         }
64         return known.size() == numVertices;
65     }
66
67     public static <V, E> boolean isTree(Graph<V, E> g)
68     {
69         return
70             isConnected(g)
71             && (g.edgeSet().size() == (g.vertexSet().size() - 1));
72     }
73
74     public static <V, E> boolean isBipartite(Graph<V, E> g)
75     {
76         if (
77             (4 * g.edgeSet().size())
78             > (g.vertexSet().size() * g.vertexSet().size())) {
79             return false;
80         }
81         if (isEmpty(g)) {
82             return true;
83         }
84
85         Set<V> unknown = new HashSet<V>(g.vertexSet());
86         LinkedList<V> queue = new LinkedList<V>();
87         V v = unknown.iterator().next();
88         Set<V> odd = new HashSet<V>();
89
90         queue.add(v);
91
92         while (!unknown.isEmpty()) {
93             if (queue.isEmpty()) {
94                 queue.add(unknown.iterator().next());
95             }
96
97             v = queue.removeFirst();
98             unknown.remove(v);
99
100             for (
101                 Iterator<V> it = Graphs.neighborListOf(g, v).iterator();
102                 it.hasNext();) {
103                 V n = it.next();
104                 if (unknown.contains(n)) {
105                     queue.add(n);
106                     if (!odd.contains(v)) {
107                         odd.add(n);
108                     }
109                 } else if (!(odd.contains(v) ^ odd.contains(n))) {
110                     return false;
111                 }
112             }
113         }
114         return true;
115     }
116 }
117
Popular Tags