// file: graph.cpp // // implementation file for ADT graph // #include // for INT_MAX #include #include "graph.h" #include #include graph::graph (unsigned int n) : size (n), labels (size), adjacent (size), temp (size) { } graph::graph (unsigned int n, int directed) : size (n), labels (size), adjacent (size), temp (size), direct (directed) { } void graph::build () { int i; const char sentinel = '0'; char v1, v2; // first get the labels cout << "Vertex names are assumed to be uppercase alphabetic characters\n"; for (i = 0; i < size; i++) labels [i] = 'A' + i; // initialize main diagonal to 0 for (i = 0; i > v1; if (v1 == sentinel) break; cin >> v2; // check that vertex is in range while (v1 < 'A' || v1 >= ('A' + size) || v2 < 'A' || v2 >= ('A' + size)) { cout << "Re-enter edge: "; cin >> v1 >> v2; } adjacent [v1 - 'A'][v2 - 'A'] = 1; if (! direct) adjacent [v2 - 'A'][v1 - 'A'] = 1; } while (v1 != sentinel); } void graph::print() { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) cout << adjacent [i] [j] << " "; cout << endl; } } weightedGraph::weightedGraph (unsigned int n) : graph (n) { // allocate the adjacency matrix and the labels vector } weightedGraph::weightedGraph (unsigned int n, int directed) : graph (n, directed) { // allocate the adjacency matrix and the labels vector } void weightedGraph::build () { int i, weight; const char sentinel = '0'; char v1, v2; // first get the labels cout << "Vertex names are assumed to be uppercase alphabetic characters\n"; for (i = 0; i < size; i++) labels [i] = 'A' + i; // initialize main diagonal to 0 for (i = 0; i > v1; if (v1 == sentinel) break; cin >> v2 >> weight; // check that vertex is in range while (v1 < 'A' || v1 >= ('A' + size) || v2 < 'A' || v2 >= ('A' + size)) { cout << "Re-enter edge and weight: "; cin >> v1 >> v2 >> weight; } adjacent [v1 - 'A'][v2 - 'A'] = weight; if (! direct) adjacent [v2 - 'A'][v1 - 'A'] = weight; } while (v1 != sentinel); } void weightedGraph::build (char * filename) { // assume for simplicity that the file has the form of an // adjacency matrix: it consists of size by size entries int i, j; fstream infile; infile.open (filename, ios::in); if (!infile) cout << "Error opening " << filename << endl; // assign the labels for (i = 0; i < size; i++) labels [i] = 'A' + i; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) infile >> adjacent [i][j]; } infile.close (); } //non-member function int DetermineSize () { int temp; do { cout << "\nEnter number of vertices: "; cin >> temp; } while (temp <= 0); return temp; }