1
14 package demo.algo;
15
16 import demo.base.RandomGraphGenerator;
17 import y.algo.GraphConnectivity;
18 import y.base.EdgeCursor;
19 import y.base.EdgeMap;
20 import y.base.Graph;
21 import y.base.Node;
22 import y.base.NodeCursor;
23 import y.base.NodeList;
24 import y.base.NodeMap;
25 import y.util.D;
26 import y.util.Maps;
27 import y.util.Timer;
28 import y.util.YRandom;
29
30
34 public class GraphConnectivityTest {
35 private Timer t1 = new Timer( false );
36 private Timer t2 = new Timer( false );
37
38 public static void main( String args[] ) {
39 (new GraphConnectivityTest()).doIt();
40 }
41
42 private void doIt() {
43 for ( int i = 0; i < 400; i++ ) {
44 D.bug( "test " + i );
45 test1( i );
46 }
47
48 D.bug( "connectivity timer: " + t1 + " biconnectivity timer: " + t2 );
49 }
50
51 private void test1( int seed ) {
52 RandomGraphGenerator rg = new RandomGraphGenerator( seed );
54 YRandom random = new YRandom( seed );
55 rg.setNodeCount( random.nextInt( 400 ) );
56 rg.setEdgeCount( random.nextInt( 800 ) );
57
58 Graph graph = rg.generate();
59
60 t1.start();
61 NodeList[] comps = GraphConnectivity.connectedComponents( graph );
63 t1.stop();
64
65 int oldCompCount = comps.length + 1;
70 while ( comps.length > 1 ) {
71 oldCompCount = comps.length;
72 graph.createEdge( comps[0].firstNode(), comps[1].firstNode() );
74 comps = GraphConnectivity.connectedComponents( graph );
75 if ( comps.length != oldCompCount - 1 ) {
76 error( "connected components yields wrong result!" );
77 }
78 }
79
80 GraphConnectivity.makeConnected( graph );
83
84 NodeMap aMap = Maps.createIndexNodeMap( new boolean[graph.N()] );
88 EdgeMap cMap = graph.createEdgeMap();
91
92
93 GraphConnectivity.makeConnected( graph );
94
95 t2.start();
96 int bicompCount = GraphConnectivity.biconnectedComponents( graph, cMap, aMap );
97 t2.stop();
98
99 for ( NodeCursor nc = graph.nodes(); nc.ok(); nc.next() ) {
102 if ( aMap.getBool( nc.node() ) ) {
103 Node v = nc.node();
104 for ( EdgeCursor ec = v.edges(); ec.ok(); ec.next() )
107 graph.removeEdge( ec.edge() );
108 }
109 }
110
111 graph.disposeEdgeMap( cMap );
113
114 }
115
116 private static void error( String msg ) {
117 D.bug( msg );
118 System.exit( 666 );
119 }
120
121 }
122
123
124
125