CS 3343/3341
 Analysis of Algorithms 
Spring 2012
  Breadth-first Search   

This is an initial run of the breadth-first search code. It seems to be working correctly.

Graph construction: 48 mainland US capitals. Data from file: capsdistnum.txt
// Graph.java: set up data structure for graph
//  Uses adjacency list representation
import java.io.*;
import java.util.Scanner;
public class Graph {
   private int count; // number of nodes
   private Scanner sc; // input file name
   private GraphNode[] graph;
   private Queue queue;

   private void err(int code) {
      System.exit(code);
   }

   public Graph(String fileName, int ct) {
      count = ct;
      int num1 = 0, num2 = 0, num = 0;
      queue = new Queue(100);
      graph = new GraphNode[count];
      for (int i = 0; i < count; i++)
         graph[i] = null;
      try {
         sc = new Scanner(new
            File("capsdistnum.txt"));
      }
      catch (Exception exception ) { err(1); }
      while (sc.hasNextInt()) {
         num1 = sc.nextInt();
         if (sc.hasNextInt())
            num2 = sc.nextInt();
         else err(2);
         if (sc.hasNextInt())
            num = sc.nextInt();
         else err(3);
         // carry out insertions, both directions
         insert(num1, num2, num);
         insert(num2, num1, num);
     }
   }

   private void insert(int num1, int num2,
           int dist) {
      // patch the new node in at the start
      GraphNode node = graph[num1];
      if (node == null) {
         GraphNode gnode = new GraphNode();
         graph[num1] = gnode;
         EdgeNode enode = new EdgeNode(num2, null,
            dist);
         graph[num1].firstEdgeNode = enode;
      }
      else {
         EdgeNode enode = new EdgeNode(num2,
            graph[num1].firstEdgeNode, dist);
         graph[num1].firstEdgeNode = enode;
      }
   }

   public void breadthSearch(int s) { // 0 <= s <= 47
      int u, v; // vertices used in loop
      graph[s].color = 1; // gray
      graph[s].d = 0;
      graph[s].pi = -1;
      queue.enqueue(s);
      System.out.println("add vertex:" + s);
      while (!queue.isEmpty()) {
         u = queue.dequeue();
         System.out.println("remove vertex:" + u);
         EdgeNode vnode = graph[u].firstEdgeNode;
         v = vnode.vertexNum;
         while(true) {
            System.out.println("edge: (" + u + 
                  "," + v + ")");
            if (graph[v].color == 0) {  // white
               graph[v].color = 1; // gray
               graph[v].d = graph[u].d + 1;
               graph[v].pi = u;
               queue.enqueue(v);
            }
            vnode = vnode.nextEdgeNode;
            if (vnode == null) break;
            else v = vnode.vertexNum;
         }
         graph[u].color = 2; // black
      }
      System.out.println("*********************");
      for (int i = 0; i < count; i++) {
         if (i < 10) System.out.print(" ");
         System.out.println(i + ": color:" + 
             graph[i].color + ", d:" +
             graph[i].d + ", pi:" +
             graph[i].pi + "\tEdge: (" +
             graph[i].pi + "," +
             i + ")");
      }

   }

   public void printGraph() {
      for (int i = 0; i < count; i++) {
         System.out.print(i + ": ");
         EdgeNode node = graph[i].firstEdgeNode;
         while (node != null) {
            System.out.print("[" + node.vertexNum +
               "," + node.edgeDist + "]");
            node = node.nextEdgeNode;
            if (node != null)System.out.print(",");
            else System.out.print("\n");
         }
      }
   }
}
// GraphNode.java: node for graph's vertex
//  Holds vertex info, link to adj. list
public class GraphNode {
   public EdgeNode firstEdgeNode;
   // other vertex info here
   public int color; // 0, 1, 2 = white, gray, black
   public int d;
   public int pi;

   public GraphNode() {
      firstEdgeNode = null;
      // initialize other vertex info here
      color = 0; // white
      d = 100000000;
      pi = -1;
   }
}

// EdgeNode.java: holds graph's edge info // Implement adjacency list public class EdgeNode { public int vertexNum; // vertex num public EdgeNode nextEdgeNode; // next public int edgeDist; // edge length // other edge info here public EdgeNode(int num, EdgeNode node, int dist) { vertexNum = num; nextEdgeNode = node; edgeDist = dist; // initialize other edge info here } }
// GraphMain.java: Controls Graph Program import java.io.*; public class GraphMain { public static void main(String[] args) { final int GRAPHSIZE = 48; Graph graph = new Graph( "capsdistnum.txt", GRAPHSIZE); // graph.printGraph(); graph.breadthSearch(3); // Washington } }

Detailed Output from breadthSearch
add vertex:3
remove vertex:3
edge: (3,6)
edge: (3,2)
remove vertex:6
edge: (6,10)
edge: (6,9)
edge: (6,5)
edge: (6,3)
edge: (6,2)
edge: (6,1)
remove vertex:2
edge: (2,3)
edge: (2,6)
edge: (2,1)
edge: (2,0)
remove vertex:10
edge: (10,16)
edge: (10,15)
edge: (10,9)
edge: (10,6)
remove vertex:9
edge: (9,10)
edge: (9,15)
edge: (9,14)
edge: (9,8)
edge: (9,6)
edge: (9,5)
remove vertex:5
edge: (5,6)
edge: (5,9)
edge: (5,8)
edge: (5,4)
edge: (5,1)
remove vertex:1
edge: (1,2)
edge: (1,6)
edge: (1,5)
edge: (1,4)
edge: (1,0)
remove vertex:0
edge: (0,2)
edge: (0,1)
edge: (0,4)
remove vertex:16
edge: (16,21)
edge: (16,15)
edge: (16,10)
remove vertex:15
edge: (15,16)
edge: (15,21)
edge: (15,20)
edge: (15,14)
edge: (15,10)
edge: (15,9)
remove vertex:14
edge: (14,15)
edge: (14,20)
edge: (14,19)
edge: (14,13)
edge: (14,9)
edge: (14,8)
remove vertex:8
edge: (8,9)
edge: (8,14)
edge: (8,13)
edge: (8,12)
edge: (8,7)
edge: (8,5)
remove vertex:4
edge: (4,5)
edge: (4,7)
edge: (4,1)
edge: (4,0)
remove vertex:21
edge: (21,24)
edge: (21,20)
edge: (21,16)
edge: (21,15)
remove vertex:20
edge: (20,21)
edge: (20,24)
edge: (20,23)
edge: (20,19)
edge: (20,15)
edge: (20,14)
remove vertex:19
edge: (19,20)
edge: (19,23)
edge: (19,27)
edge: (19,26)
edge: (19,18)
edge: (19,14)
edge: (19,13)
edge: (19,12)
remove vertex:13
edge: (13,14)
edge: (13,19)
edge: (13,12)
edge: (13,8)
remove vertex:12
edge: (12,13)
edge: (12,19)
edge: (12,18)
edge: (12,11)
edge: (12,8)
edge: (12,7)
remove vertex:7
edge: (7,8)
edge: (7,12)
edge: (7,11)
edge: (7,4)
remove vertex:24
edge: (24,29)
edge: (24,23)
edge: (24,21)
edge: (24,20)
remove vertex:23
edge: (23,24)
edge: (23,28)
edge: (23,27)
edge: (23,20)
edge: (23,19)
remove vertex:27
edge: (27,28)
edge: (27,34)
edge: (27,33)
edge: (27,32)
edge: (27,26)
edge: (27,23)
edge: (27,19)
remove vertex:26
edge: (26,27)
edge: (26,32)
edge: (26,36)
edge: (26,31)
edge: (26,25)
edge: (26,22)
edge: (26,19)
edge: (26,18)
remove vertex:18
edge: (18,19)
edge: (18,26)
edge: (18,22)
edge: (18,17)
edge: (18,12)
edge: (18,11)
remove vertex:11
edge: (11,12)
edge: (11,18)
edge: (11,17)
edge: (11,7)
remove vertex:29
edge: (29,34)
edge: (29,28)
edge: (29,24)
remove vertex:28
edge: (28,29)
edge: (28,34)
edge: (28,27)
edge: (28,23)
remove vertex:34
edge: (34,38)
edge: (34,33)
edge: (34,29)
edge: (34,28)
edge: (34,27)
remove vertex:33
edge: (33,34)
edge: (33,38)
edge: (33,37)
edge: (33,32)
edge: (33,27)
remove vertex:32
edge: (32,33)
edge: (32,37)
edge: (32,36)
edge: (32,27)
edge: (32,26)
remove vertex:36
edge: (36,35)
edge: (36,32)
edge: (36,31)
edge: (36,26)
remove vertex:31
edge: (31,36)
edge: (31,35)
edge: (31,30)
edge: (31,26)
edge: (31,25)
remove vertex:25
edge: (25,26)
edge: (25,31)
edge: (25,30)
edge: (25,22)
remove vertex:22
edge: (22,26)
edge: (22,25)
edge: (22,18)
edge: (22,17)
remove vertex:17
edge: (17,18)
edge: (17,22)
edge: (17,11)
remove vertex:38
edge: (38,41)
edge: (38,40)
edge: (38,39)
edge: (38,37)
edge: (38,34)
edge: (38,33)
remove vertex:37
edge: (37,38)
edge: (37,39)
edge: (37,33)
edge: (37,32)
remove vertex:35
edge: (35,36)
edge: (35,31)
remove vertex:30
edge: (30,31)
edge: (30,25)
remove vertex:41
edge: (41,42)
edge: (41,44)
edge: (41,43)
edge: (41,40)
edge: (41,38)
remove vertex:40
edge: (40,41)
edge: (40,39)
edge: (40,38)
remove vertex:39
edge: (39,40)
edge: (39,38)
edge: (39,37)
remove vertex:42
edge: (42,45)
edge: (42,44)
edge: (42,41)
remove vertex:44
edge: (44,45)
edge: (44,46)
edge: (44,43)
edge: (44,42)
edge: (44,41)
remove vertex:43
edge: (43,44)
edge: (43,46)
edge: (43,41)
remove vertex:45
edge: (45,47)
edge: (45,44)
edge: (45,42)
remove vertex:46
edge: (46,44)
edge: (46,43)
remove vertex:47
edge: (47,45)

Dump of information about each vertex, including
vertex, distance to it (d), predecessor vertex (pi),
and the directed edges in the breadth-first tree
 0: color:2, d:2, pi:2  Edge: (2,0)
 1: color:2, d:2, pi:6  Edge: (6,1)
 2: color:2, d:1, pi:3  Edge: (3,2)
 3: color:2, d:0, pi:-1 Edge: (-1,3)
 4: color:2, d:3, pi:5  Edge: (5,4)
 5: color:2, d:2, pi:6  Edge: (6,5)
 6: color:2, d:1, pi:3  Edge: (3,6)
 7: color:2, d:4, pi:8  Edge: (8,7)
 8: color:2, d:3, pi:9  Edge: (9,8)
 9: color:2, d:2, pi:6  Edge: (6,9)
10: color:2, d:2, pi:6  Edge: (6,10)
11: color:2, d:5, pi:12 Edge: (12,11)
12: color:2, d:4, pi:8  Edge: (8,12)
13: color:2, d:4, pi:14 Edge: (14,13)
14: color:2, d:3, pi:9  Edge: (9,14)
15: color:2, d:3, pi:10 Edge: (10,15)
16: color:2, d:3, pi:10 Edge: (10,16)
17: color:2, d:6, pi:18 Edge: (18,17)
18: color:2, d:5, pi:19 Edge: (19,18)
19: color:2, d:4, pi:14 Edge: (14,19)
20: color:2, d:4, pi:15 Edge: (15,20)
21: color:2, d:4, pi:16 Edge: (16,21)
22: color:2, d:6, pi:26 Edge: (26,22)
23: color:2, d:5, pi:20 Edge: (20,23)
24: color:2, d:5, pi:21 Edge: (21,24)
25: color:2, d:6, pi:26 Edge: (26,25)
26: color:2, d:5, pi:19 Edge: (19,26)
27: color:2, d:5, pi:19 Edge: (19,27)
28: color:2, d:6, pi:23 Edge: (23,28)
29: color:2, d:6, pi:24 Edge: (24,29)
30: color:2, d:7, pi:31 Edge: (31,30)
31: color:2, d:6, pi:26 Edge: (26,31)
32: color:2, d:6, pi:27 Edge: (27,32)
33: color:2, d:6, pi:27 Edge: (27,33)
34: color:2, d:6, pi:27 Edge: (27,34)
35: color:2, d:7, pi:36 Edge: (36,35)
36: color:2, d:6, pi:26 Edge: (26,36)
37: color:2, d:7, pi:33 Edge: (33,37)
38: color:2, d:7, pi:34 Edge: (34,38)
39: color:2, d:8, pi:38 Edge: (38,39)
40: color:2, d:8, pi:38 Edge: (38,40)
41: color:2, d:8, pi:38 Edge: (38,41)
42: color:2, d:9, pi:41 Edge: (41,42)
43: color:2, d:9, pi:41 Edge: (41,43)
44: color:2, d:9, pi:41 Edge: (41,44)
45: color:2, d:10,pi:42 Edge: (42,45)
46: color:2, d:10,pi:44 Edge: (44,46)
47: color:2, d:11,pi:45 Edge: (45,47)


Revision date: 2011-10-05. (Please use ISO 8601, the International Standard Date and Time Notation.)