CS 3343/3341 Analysis of Algorithms Spring 2012 |
Recitation 9 Graph of Capitals, C Version Partial Answers |
Graph construction: 48 mainland US capitals. |
---|
// graph.c: set up data structure for graph // Uses adjacency list representation #include <stdio.h> #include <stdlib.h> #define GRAPHSIZE 48 struct graphnode { struct edgenode* firstedgenode; // other vertex info here }; struct edgenode { int vertexnum; int edgedist; struct edgenode* nextedgenode; // other edge info here }; void printgraph(struct graphnode* graph[], int count); struct graphnode* newgraphnode(); struct edgenode* newedgenode(int num, struct edgenode* node, int dist); void insert(struct graphnode* graph[], int num1, int num2, int dist); int edgedistance(struct graphnode* graph[], int v1, int v2); int pathlength(struct graphnode* graph[], int path[], int len); int main() { // three Hamiltonian paths int ham1[] = {47,45,42,44,46,43,41,40,39,37,33,38, 34,28,29,24,21,16,10,15,20,23,27,32, 26,36,35,31,30,25,22,18,17,11, 7,12, 8,13,19,14, 9, 5, 4, 0, 2, 1, 6, 3}; int ham2[] = {47,45,42,44,46,43,41,40,38,39,37,32, 36,35,31,30,25,22,17,11,12,18,26,27, 33,34,29,28,23,19,13,14,20,24,21,15, 16,10, 6, 5, 9, 8, 7, 4, 1, 0, 2, 3}; int ham3[] = {47,45,42,44,46,43,41,40,39,37,33,32, 36,35,31,30,25,26,27,28,23,20,19,18, 22,17,11,12,13,14,15, 9, 8, 7, 4, 5, 1, 0, 2, 3, 6,10,16,21,24,29,34,38}; struct graphnode* graph[GRAPHSIZE]; int i; int num1, num2, num; for(i = 0; i < GRAPHSIZE; i++) graph[i] = newgraphnode(); FILE *infile; infile = fopen("capsdist.txt", "r"); if (infile == NULL) { fprintf(stderr, "Can't open %s\n", "source.txt"); exit(1); } while (fscanf(infile, "%i %i %i", &num1, &num2, &num) != EOF) { insert(graph, num1, num2, num); insert(graph, num2, num1, num); } // printgraph(graph, GRAPHSIZE); printf("Path length: %i\n", pathlength(graph, ham2, 48)); } struct graphnode* newgraphnode(){ struct graphnode* nnode = malloc(sizeof(struct graphnode)); nnode -> firstedgenode = NULL; return nnode; } struct edgenode* newedgenode(int num, struct edgenode* node, int dist) { struct edgenode* nnode = malloc(sizeof(struct edgenode)); nnode -> vertexnum = num; nnode -> nextedgenode = node; nnode -> edgedist = dist; return nnode; } void insert(struct graphnode* graph[], int num1, int num2, int dist){ if (graph[num1] -> firstedgenode == NULL) { struct edgenode* enode = newedgenode(num2, NULL, dist); graph[num1] -> firstedgenode = enode; } else { struct edgenode* enode = newedgenode(num2, graph[num1] -> firstedgenode, dist); graph[num1] -> firstedgenode = enode; } } void printgraph(struct graphnode* graph[], int count) { int i; for (i = 0; i < count; i++) { printf("%2i: ", i); struct edgenode* node = graph[i] -> firstedgenode; while (node != NULL) { printf("[%2i,%3i]", node -> vertexnum, node -> edgedist); node = node -> nextedgenode; if (node != NULL) printf(","); else printf("\n"); } } } int edgedistance(struct graphnode* graph[], int v1, int v2) { if (v1 < 0 || v1 > GRAPHSIZE-1) return -1; if (graph[v1] == NULL) return -1; struct edgenode* node = graph[v1] -> firstedgenode; while (node != NULL) { if (node -> vertexnum == v2) return node -> edgedist; node = node -> nextedgenode; } return -1; } int pathlength(struct graphnode* graph[], int path[], int len) { int dist = 0, i; for (i = 0; i < len-1; i++) { int temp = edgedistance(graph, path[i], path[i+1]); if (temp == -1) return -1; dist += temp; } return dist; } |