From 9800a723a7346ea959d9a1c780398ee8403d44f5 Mon Sep 17 00:00:00 2001 From: phiresky Date: Sat, 20 Dec 2014 16:24:36 +0100 Subject: [PATCH 1/2] use vector instead of bitset --- cpp.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/cpp.cpp b/cpp.cpp index 5eae2f2..26f9881 100644 --- a/cpp.cpp +++ b/cpp.cpp @@ -28,13 +28,12 @@ vector readPlaces(){ return nodes; } -template -int getLongestPath(const vector &nodes, const int nodeID, bitset visited){ +int getLongestPath(const vector &nodes, const int nodeID, vector& visited){ visited[nodeID] = true; int max=0; for(const route &neighbour: nodes[nodeID].neighbours){ if (visited[neighbour.dest] == false){ - const int dist = neighbour.cost + getLongestPath(nodes, neighbour.dest, visited); + const int dist = neighbour.cost + getLongestPath(nodes, neighbour.dest, visited); if (dist > max){ max = dist; } @@ -46,21 +45,8 @@ int getLongestPath(const vector &nodes, const int nodeID, bitset visite int getLongestPath(const vector &nodes) { - if (nodes.size() <= 16) { - return getLongestPath<16>(nodes, 0, bitset<16>()); - } else if (nodes.size() <= 256) { - return getLongestPath<256>(nodes, 0, bitset<256>()); - } else if (nodes.size() <= 4096) { - return getLongestPath<4096>(nodes, 0, bitset<4096>()); - } else if (nodes.size() <= 65536) { - return getLongestPath<65536>(nodes, 0, bitset<65536>()); - } else if (nodes.size() <= 1048576) { - return getLongestPath<1048576>(nodes, 0, bitset<1048576>()); - } else if (nodes.size() <= 16777216) { - return getLongestPath<16777216>(nodes, 0, bitset<16777216>()); - } else { - return -1; - } + vector visited(nodes.size()); + return getLongestPath(nodes, 0, visited); } int main(int argc, char** argv){ From b7eea7bd874ca0f303969d075a09348948d82f03 Mon Sep 17 00:00:00 2001 From: phiresky Date: Sat, 20 Dec 2014 16:50:00 +0100 Subject: [PATCH 2/2] C++ implementation with more refs --- cpp | Bin 17927 -> 0 bytes cpp.cpp | 35 +++++++++++++++-------------------- 2 files changed, 15 insertions(+), 20 deletions(-) delete mode 100755 cpp diff --git a/cpp b/cpp deleted file mode 100755 index fcfdf2db5f5cd56227cfa7bc865ab0aab9499414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17927 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 diff --git a/cpp.cpp b/cpp.cpp index 26f9881..ca7a0b6 100644 --- a/cpp.cpp +++ b/cpp.cpp @@ -1,20 +1,21 @@ -#include #include -#include #include #include -#include #include using namespace std; using namespace std::chrono; +struct node; + struct route{ - int dest, cost; + node& dest; + const int cost; }; struct node { vector neighbours; + bool visited = false; }; vector readPlaces(){ @@ -23,36 +24,30 @@ vector readPlaces(){ vector nodes(numNodes); int node, neighbour, cost; while (text >> node >> neighbour >> cost){ - nodes[node].neighbours.push_back(route{neighbour, cost}); + nodes[node].neighbours.push_back(route{nodes[neighbour], cost}); } return nodes; } -int getLongestPath(const vector &nodes, const int nodeID, vector& visited){ - visited[nodeID] = true; +int getLongestPath(vector &nodes, node &node){ + node.visited = true; int max=0; - for(const route &neighbour: nodes[nodeID].neighbours){ - if (visited[neighbour.dest] == false){ - const int dist = neighbour.cost + getLongestPath(nodes, neighbour.dest, visited); + for(const route &neighbour: node.neighbours){ + if (!neighbour.dest.visited){ + const int dist = neighbour.cost + getLongestPath(nodes, neighbour.dest); if (dist > max){ max = dist; } } } - visited[nodeID] = false; + node.visited = false; return max; } -int getLongestPath(const vector &nodes) -{ - vector visited(nodes.size()); - return getLongestPath(nodes, 0, visited); -} - -int main(int argc, char** argv){ - auto nodes = readPlaces(); +int main() { + vector nodes = readPlaces(); auto start = high_resolution_clock::now(); - int len = getLongestPath(nodes); + int len = getLongestPath(nodes, nodes[0]); auto end = high_resolution_clock::now(); auto duration = (int)(0.001 * duration_cast(end - start).count()); cout << len << " LANGUAGE C++ " << duration << std::endl;