From c26b8d500e902ac00a75f5933bb86bd6269837b6 Mon Sep 17 00:00:00 2001 From: jakedcolbert Date: Wed, 4 May 2022 13:51:43 -0400 Subject: [PATCH 1/2] Progress with requirement 5 --- Makefile | 67 ++++++++++++++- project5 | Bin 214192 -> 216688 bytes project5.cc | 4 +- province.cc | 172 +++++++++++++++++++++++-------------- province.h | 4 + test-data/project5.out | 27 ++++++ test-data/requirement1.out | 39 +++++++++ test-data/shortest.out | 20 +++++ 8 files changed, 263 insertions(+), 70 deletions(-) create mode 100644 test-data/requirement1.out diff --git a/Makefile b/Makefile index 936c3e0..cf4c998 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,16 @@ # Author: Elijah Opoku-Nyarko and Jake Colbert +# define colors +ifneq (,$(findstring xterm,${TERM})) + RED := $(shell tput -Txterm setaf 1) + GREEN := $(shell tput -Txterm setaf 2) + RESET := $(shell tput -Txterm sgr0) +else + RED := "" + GREEN := "" + RESET := "" +endif + # default target all: project5 @@ -7,9 +18,57 @@ all: project5 project5: project5.cc province.cc province.h g++ -std=c++11 -o project5 project5.cc province.cc -# test the code against an expected output file -# this test should grow into a spaceship and end with blinkers -test-requirement1: project5 +# test all the code +test-all: project5 test-nowhere test-one-road test-simple test-local test-combo + @echo "" + @echo "$(GREEN)Passed all tests!$(RESET)" + @echo "" + +test: project5 ./project5 < test-data/t0502-combo.in > test-data/project5.out diff test-data/project5.out test-data/shortest.out > test.diff - rm test-data/project5.out \ No newline at end of file + +# test the code against an expected output file +test-nowhere: project5 + @echo "" + @echo "$(RED)--- Nowhere Test ---$(RESET)" + @echo "" + ./project5 < test-data/t01-nowhere.in > test-data/project5.out + diff test-data/project5.out test-data/t01-nowhere.out > test.diff + @echo "$(GREEN)Passed!$(RESET)" + +# test the code against an expected output file +test-one-road: project5 + @echo "" + @echo "$(RED)--- One Road Test ---$(RESET)" + @echo "" + ./project5 < test-data/t02-one-road.in > test-data/project5.out + diff test-data/project5.out test-data/t02-one-road.out > test.diff + @echo "$(GREEN)Passed!$(RESET)" + +# test the code against an expected output file +test-simple: project5 + @echo "" + @echo "$(RED)--- Simple Test ---$(RESET)" + @echo "" + ./project5 < test-data/t03-simple.in > test-data/project5.out + diff test-data/project5.out test-data/t03-simple.out > test.diff + @echo "$(GREEN)Passed!$(RESET)" + +# test the code against an expected output file +test-local: project5 + @echo "" + @echo "$(RED)--- Local Test ---$(RESET)" + @echo "" + ./project5 < test-data/t08-local.in > test-data/project5.out + diff test-data/project5.out test-data/t08-local.out > test.diff + @echo "$(GREEN)Passed!$(RESET)" + +# test the code against an expected output file +test-combo: project5 + @echo "" + @echo "$(RED)--- Combo Test ---$(RESET)" + @echo "" + ./project5 < test-data/t0502-combo.in > test-data/project5.out + diff test-data/project5.out test-data/t0502-combo.out > test.diff + @echo "$(GREEN)Passed!$(RESET)" \ No newline at end of file diff --git a/project5 b/project5 index 68879e562dee026898af2fce94ea1396507b09f5..e81b6e3c9e16d4ba9879e7e442f7d9c6b6acba13 100755 GIT binary patch delta 38935 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 _towns[i]._name; // This needs to be converted to vector, im not sure how exactly - //cout << "This is the name: " << &_towns[i]._name << endl; + source >> _towns[i]._name; townMap[_towns[i]._name] = i; } // Read roads for (int i = 0; i < _numberOfRoads; i++) { - std::string tail, head; - source >> tail >> head; - int tailIndex = townMap[tail]; // index of the first town - int headIndex = townMap[head]; // index of the second town - - // Get the type of road ("B" If Bridge, "N" if normal road) - char type; - source >> type; - bool isBridge = (type == 'B'); - // Not sure how to Get the type if it is a normal road (ie. Not a Bridge) - - // Length of road - double length; - source >> length; - - // Add a road to the road list - Road newRoad(headIndex, tailIndex, isBridge, length); - _roads.push_back(newRoad); - - // Add a road to two connecting towns - _towns[tailIndex]._roads.push_back(Road(headIndex, tailIndex, - isBridge, length)); - _towns[headIndex]._roads.push_back(Road(tailIndex, headIndex, - isBridge, length)); - - + string tail, head; + char bridgeFlag; + double length; + source >> tail >> head >> bridgeFlag >> length; + bool isBridge = (bridgeFlag == 'B'); + _roads.push_back(Road(townMap.at(head), townMap.at(tail), isBridge, length)); + _towns[townMap.at(tail)]._roads.push_back(Road(townMap.at(head), townMap.at(tail), isBridge, length)); + _towns[townMap.at(head)]._roads.push_back(Road(townMap.at(tail), townMap.at(head), isBridge, length)); } } void Province::printAll(int start, std::ostream & output) { // keep track of whether a town(vertex) has been scheduled to be visited bool scheduled[_numberOfTowns]; - for (int i = 0; i < _numberOfTowns; i++){ - scheduled[i] = false; - } + memset(scheduled, 0, sizeof scheduled); // initialize to 0/false // Keep track of which towns have been visited queue toVisit; // use queue to keep track of which town to visit next @@ -147,13 +126,6 @@ void Province::printShortestPath(std::ostream & output) const { output << "The shortest paths from " + _towns[0]._name; output << " are:" << std::endl << std::endl; - // keeps track of the index of the predecessor to each - // town(vertex) n on the shortest path to n - int prev[_numberOfTowns]; - - output << "The shortest routes from " + _towns[0]._name; - output << " are:" << std::endl << std::endl; - // keeps track of the index of the predecessor to each // town(vertex) n on the shortest path to n int prev[_numberOfTowns]; @@ -311,15 +283,18 @@ void Province::minSpan(std::ostream & output) const { } } - output << "The road upgrading goal can be achieved at minimal cost by upgrading:"; - output << std::endl; - - // Print names of towns in minimum spanning tree of province - for (int i = 0; i < minSpanTree.size(); i++) { - output << " "; - output << _towns[minSpanTree[i]._head]._name; - output << " to "; - output << _towns[minSpanTree[i]._tail]._name << std::endl; + output << "The road upgrading goal can be achieved at minimal cost by upgrading:"; + output << std::endl; + + // Print names of towns in minimum spanning tree of province + for (int i = 0; i < minSpanTree.size(); i++) { + output << " "; + output << _towns[minSpanTree[i]._head]._name; + output << " to "; + output << _towns[minSpanTree[i]._tail]._name << std::endl; + } + output << endl; +} std::vector Province::bfs(int start) const { // Initialize list of towns scheduled to visit @@ -374,26 +349,14 @@ void Province::removeBridges(ostream &output) const { break; } } - // If only one town - if (_numberOfTowns == 1) { - output << "There is only one town, so the province " - << "will not be affected by a major storm"; - return; - - // If province has no bridge - } else if (!hasBridge) { - output << "The province has no bridges, so it " - << "will not be affected by a major storm"; - return; - } // Mark all towns as unvisited list toVisit; for (int i = 0; i < _numberOfTowns; i++) { toVisit.push_back(i); } - output << "Connected components in event of a major storm are: "; - output << endl << endl; + output << "Connected components in event of a major storm are:"; + output << endl; while (!toVisit.empty()) { // Mark current town as visited @@ -408,16 +371,95 @@ void Province::removeBridges(ostream &output) const { toVisit.remove(bfsResult[i]); } - output << " "; + output << " "; output << "If all bridges fail, the following towns would form "; output << "an isolated group:" << endl; // Print names of all towns in connected component for (int i = 0; i < bfsResult.size(); i++) { - output << " "; + output << " "; output << _towns[bfsResult[i]]._name << endl; } + output << endl; } - } +void Province::APUtil(int u, bool visited[], + int disc[], int low[], int& time, int parent, + bool isAP[]) const { + // Count of children in DFS Tree + int children = 0; + + // Mark the current node as visited + visited[u] = true; + + // Initialize discovery time and low value + disc[u] = low[u] = ++time; + + // Go through all vertices adjacent to this + for (int v = 0; v < _numberOfTowns; v++) { + // If v is not visited yet, then make it a child of u + // in DFS tree and recur for it + if (!visited[v]) { + children++; + APUtil(v, visited, disc, low, time, u, isAP); + + // Check if the subtree rooted with v has + // a connection to one of the ancestors of u + low[u] = min(low[u], low[v]); + + // If u is not root and low value of one of + // its child is more than discovery value of u. + if (parent != -1 && low[v] >= disc[u]) { + isAP[u] = true; + } + } else if (v != parent) { + low[u] = min(low[u], disc[v]); + } + } + + // If u is root of DFS tree and has two or more children. + if (parent == -1 && children > 1) { + isAP[u] = true; + } +} + +void Province::articulationPoints(std::ostream & output) const +{ + int disc[_numberOfTowns]; + memset(disc, 0, sizeof disc); + int low[_numberOfTowns]; + bool visited[_numberOfTowns]; + memset(visited, false, sizeof visited); + bool isAP[_numberOfTowns]; + memset(isAP, false, sizeof isAP); + int time = 0, par = -1; + + // Adding this loop so that the + // code works even if we are given + // disconnected graph + for (int u = 0; u < _numberOfTowns; u++) { + if (!visited[u]) { + APUtil(u, visited, disc, low, + time, par, isAP); + } + } + output << "Destruction of any of the following would result in the province becoming" << endl << "disconnected:" << endl; + + int count = 0; + // Printing the APs + for (int u = 0; u < _numberOfTowns; u++) { + if (isAP[u] == true) { + output << " " << _towns[u]._name << endl; + count++; + } + } + if (count == 0) { + output << " (None)" << endl; + } + output << endl; + + for (bool i : isAP) { + cerr << i << endl; + } +} \ No newline at end of file diff --git a/province.h b/province.h index fcd773f..a936882 100644 --- a/province.h +++ b/province.h @@ -61,6 +61,10 @@ class Province * @return - List of indices of towns in order of traversal */ std::vector bfs(int start) const; + + void APUtil(int u, bool visited[], + int disc[], int low[], int& time, int parent, + bool isAP[]) const; void dfsAux(int current, std::vector & dfsTowns, bool visited []) const; diff --git a/test-data/project5.out b/test-data/project5.out index 92607ce..a0c981d 100644 --- a/test-data/project5.out +++ b/test-data/project5.out @@ -14,7 +14,18 @@ The shortest paths from Wenham are: The road upgrading goal can be achieved at minimal cost by upgrading: Hamilton to Wenham +Connected components in event of a major storm are: + If all bridges fail, the following towns would form an isolated group: + Hamilton + Wenham + +Destruction of any of the following would result in the province becoming +disconnected: + (None) + + ------------------------------------------------------------------ + The input data is: A @@ -39,4 +50,20 @@ The road upgrading goal can be achieved at minimal cost by upgrading: B to A C to B +Connected components in event of a major storm are: + If all bridges fail, the following towns would form an isolated group: + C + + If all bridges fail, the following towns would form an isolated group: + B + + If all bridges fail, the following towns would form an isolated group: + A + +Destruction of any of the following would result in the province becoming +disconnected: + (None) + + ------------------------------------------------------------------ + diff --git a/test-data/requirement1.out b/test-data/requirement1.out new file mode 100644 index 0000000..d5d431a --- /dev/null +++ b/test-data/requirement1.out @@ -0,0 +1,39 @@ + +------------------------------------------------ +---------------- New DataSet: ------------------ +------------------------------------------------ + +The input data is : + + Salem + Beverly 2.4 mi via bridge + Danvers 3.7 mi via bridge + Lynn 4.9 mi + Beverly + Danvers 2.9 mi + Salem 2.4 mi via bridge + Wenham 5.2 mi + Danvers + Beverly 2.9 mi + Wenham 4.2 mi + Salem 3.7 mi via bridge + Lynn + Salem 4.9 mi + Wenham + Beverly 5.2 mi + Danvers 4.2 mi + + + +------------------------------------------------ +---------------- New DataSet: ------------------ +------------------------------------------------ + +The input data is : + + Wenham + Hamilton 1 mi + Hamilton + Wenham 1 mi + + diff --git a/test-data/shortest.out b/test-data/shortest.out index d2366e4..dcfc038 100644 --- a/test-data/shortest.out +++ b/test-data/shortest.out @@ -14,6 +14,15 @@ The shortest paths from Wenham are: The road upgrading goal can be achieved at minimal cost by upgrading: Hamilton to Wenham +Connected components in event of a major storm are: + If all bridges fail, the following towns would form an isolated group: + Wenham + Hamilton + +Destruction of any of the following would result in the province becoming +disconnected: + (None) + ------------------------------------------------------------------ @@ -41,5 +50,16 @@ The road upgrading goal can be achieved at minimal cost by upgrading: B to A C to B +Connected components in event of a major storm are: + If all bridges fail, the following towns would form an isolated group: + A + + If all bridges fail, the following towns would form an isolated group: + B + + If all bridges fail, the following towns would form an isolated group: + C + ------------------------------------------------------------------ + From 64c45719dd02184050e8cb9eb8b64c6c233e5858 Mon Sep 17 00:00:00 2001 From: jakedcolbert Date: Wed, 4 May 2022 14:10:44 -0400 Subject: [PATCH 2/2] README.md --- README.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b6062d8..52121ac 100644 --- a/README.md +++ b/README.md @@ -1 +1,26 @@ -# cps222-2022-p5-opokunyarko-colbert \ No newline at end of file +# cps222-2022-p5-opokunyarko-colbert +### Attempted & Status + +- Requirement 1 : Read and print data + +Town and road data can be correctly read and outputed to the terminal. Passes all tests with no diff issues and correct styling. Peer programmed. + +- Requirement 2 : Shortest Paths + +findShortestPath() method implemented to calculate shortest traversals and output them to the terminal. Passes all tests with no diff issues and correct stylings. Completed by Elijah Opoku-Nyarko with later revisions by Jake Colbert. + +- Requirement 3 : Upgrading + +minSpan() method implemented to find ideal connections for faster traversals and output recomendations to the terminal. Passes all tests with no diff issues and correct stylings. Completed by Elijah Opoku-Nyarko with later revisions by Jake Colbert. + +- Requirement 4 : Worst-Case Analysis of Bridge Collapse + +removeBridges() method implemented to find towns that would form isolated groups on bridge collapse. Passes all tests with some diff issues regarding ordering and correct stylings. Completed by Elijah Opoku-Nyarko with output revisions by Jake Colbert. + +- Requirement 5 : Articulation Points + +articulationPoints() method implemented to find points of the graph at which their destruction would disconnect the province graph. Does not pass tests. isAP[] array does not get modified by the recursive method and prints all zeros as it was initialized. In-Progress by Jake Colbert + +### Makefile & Testing + +A `make test-all` target has been implemented to return "Passed!" if no errors are caught when running other tests. On run, "--- ---" will be displayed to indicate which test was running upon crash. Any test error will likely result from differences in the project5.out file and the respective test.out file. View test.diff to see their differences. \ No newline at end of file