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

| 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;
}
}
| ||||||||
| 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) |