From 2ea5133eecab7be3ba7bc4d90fa8050b4eeee819 Mon Sep 17 00:00:00 2001 From: kindofman <43539680+kindofman@users.noreply.github.com> Date: Sun, 1 Dec 2019 20:29:37 +0300 Subject: [PATCH 1/4] Update main.cpp --- 11-2/main.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/11-2/main.cpp b/11-2/main.cpp index b8e507b..cfcc56b 100644 --- a/11-2/main.cpp +++ b/11-2/main.cpp @@ -5,3 +5,85 @@ Вывод: количество кратчайших путей от v к w. ссылка на Яндекс.Контест https://contest.yandex.ru/contest/15957/run-report/27592154/ + +#include +#include +#include +#include +#include +#include +#include + +using std::list; +using std::vector; +using std::queue; +using std::cout; + +void BFS(vector *adj, int src, int dist[], int* paths, int n) { + bool* visited = new bool[n]; + for (int i = 0; i < n; i++) + visited[i] = false; + dist[src] = 0; + paths[src] = 1; + + queue q; + q.push(src); + visited[src] = true; + while (!q.empty()) { + int curr = q.front(); + q.pop(); + + for (auto x : adj[curr]) { + if (visited[x] == false) { + q.push(x); + visited[x] = true; + } + if (dist[x] > dist[curr] + 1) { + dist[x] = dist[curr] + 1; + paths[x] = paths[curr]; + } + else if (dist[x] == dist[curr] + 1) + paths[x] += paths[curr]; + } + } + delete[] visited; +} + +int find_shortest_paths(vector *adj, int s, int n, int w) { + int dist[n]; + int* paths = new int[n]; + for (int i = 0; i < n; i++) + dist[i] = 2147483647; + for (int i = 0; i < n; i++) + paths[i] = 0; + BFS(adj, s, dist, paths, n); + int result = paths[w]; + delete[] paths; + return result; +} + +void add_edge(vector *adj, int u, int v) { + adj[u].push_back(v); +} + + +int main() { + int v_, n; + std::cin >> v_ >> n; + vector * adj = new vector [v_]; + + for ( int i = 0; i < n; ++i ) { + int u, v; + std::cin >> u >> v; + add_edge(adj, u, v); + add_edge(adj, v, u); + } + int v, w; + std::cin >> v >> w; + int result = find_shortest_paths(adj, v, v_, w); + cout << result << std::endl; + delete[] adj; + + return 0; +} + From a26b727e7cc4ef2590e0082d2a3cbb650f2c42b6 Mon Sep 17 00:00:00 2001 From: kindofman <43539680+kindofman@users.noreply.github.com> Date: Sun, 8 Dec 2019 10:31:54 +0300 Subject: [PATCH 2/4] Update main.cpp --- 11-2/main.cpp | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/11-2/main.cpp b/11-2/main.cpp index cfcc56b..2bf2fd8 100644 --- a/11-2/main.cpp +++ b/11-2/main.cpp @@ -13,13 +13,25 @@ #include #include #include +#define INT_MAX 2147483647 using std::list; using std::vector; using std::queue; using std::cout; -void BFS(vector *adj, int src, int dist[], int* paths, int n) { +class Graph { +public: + Graph(int v): v(v) { adj.assign(v, {}); }; + void BFS( vector > adj, int src, int dist[], int* paths, int n ); + int find_shortest_paths( int s, int n, int w ); + void add_edge( int u, int v ); +private: + const int v; + vector > adj; +}; + +void Graph::BFS( vector > adj, int src, int dist[], int* paths, int n ) { bool* visited = new bool[n]; for (int i = 0; i < n; i++) visited[i] = false; @@ -49,41 +61,40 @@ void BFS(vector *adj, int src, int dist[], int* paths, int n) { delete[] visited; } -int find_shortest_paths(vector *adj, int s, int n, int w) { +int Graph::find_shortest_paths( int s, int n, int w ) { int dist[n]; int* paths = new int[n]; for (int i = 0; i < n; i++) - dist[i] = 2147483647; + dist[i] = INT_MAX; for (int i = 0; i < n; i++) paths[i] = 0; BFS(adj, s, dist, paths, n); int result = paths[w]; delete[] paths; - return result; + return result; } -void add_edge(vector *adj, int u, int v) { +void Graph::add_edge( int u, int v ) { adj[u].push_back(v); + adj[v].push_back(u); } - int main() { int v_, n; std::cin >> v_ >> n; - vector * adj = new vector [v_]; - + Graph g(v_); for ( int i = 0; i < n; ++i ) { int u, v; std::cin >> u >> v; - add_edge(adj, u, v); - add_edge(adj, v, u); + g.add_edge( u, v ); } int v, w; std::cin >> v >> w; - int result = find_shortest_paths(adj, v, v_, w); - cout << result << std::endl; - delete[] adj; + int result = g.find_shortest_paths( v, v_, w ); + cout << result << std::endl; return 0; } + + From 541c639c8fed0580614c1760a7bc378fb4d491c4 Mon Sep 17 00:00:00 2001 From: kindofman <43539680+kindofman@users.noreply.github.com> Date: Sat, 14 Dec 2019 12:24:51 +0300 Subject: [PATCH 3/4] Update main.cpp --- 11-2/main.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/11-2/main.cpp b/11-2/main.cpp index 2bf2fd8..a1f3957 100644 --- a/11-2/main.cpp +++ b/11-2/main.cpp @@ -23,18 +23,16 @@ using std::cout; class Graph { public: Graph(int v): v(v) { adj.assign(v, {}); }; - void BFS( vector > adj, int src, int dist[], int* paths, int n ); - int find_shortest_paths( int s, int n, int w ); + void BFS( int src, vector& dist, vector& paths, int n ) const; + int find_shortest_paths( int s, int n, int w ) const; void add_edge( int u, int v ); private: const int v; vector > adj; }; -void Graph::BFS( vector > adj, int src, int dist[], int* paths, int n ) { - bool* visited = new bool[n]; - for (int i = 0; i < n; i++) - visited[i] = false; +void Graph::BFS( int src, vector& dist, vector& paths, int n ) const { + vector visited( n, false ); dist[src] = 0; paths[src] = 1; @@ -58,6 +56,49 @@ void Graph::BFS( vector > adj, int src, int dist[], int* paths, int paths[x] += paths[curr]; } } +} + +int Graph::find_shortest_paths( int s, int n, int w ) const { + vector dist( n, INT_MAX ); + vector paths( n, 0 ); + BFS( s, dist, paths, n ); + int result = paths[w]; + return result; +} + +void Graph::add_edge( int u, int v ) { + adj[u].push_back(v); + adj[v].push_back(u); +} + +int main() { + int v_, n; + std::cin >> v_ >> n; + Graph g(v_); + for ( int i = 0; i < n; ++i ) { + int u, v; + std::cin >> u >> v; + g.add_edge( u, v ); + } + int v, w; + std::cin >> v >> w; + int result = g.find_shortest_paths( v, v_, w ); + cout << result << std::endl; + + return 0; +} + + + visited[x] = true; + } + if (dist[x] > dist[curr] + 1) { + dist[x] = dist[curr] + 1; + paths[x] = paths[curr]; + } + else if (dist[x] == dist[curr] + 1) + paths[x] += paths[curr]; + } + } delete[] visited; } From cbc02487688af046a3e76c840373ffee09dd528d Mon Sep 17 00:00:00 2001 From: kindofman <43539680+kindofman@users.noreply.github.com> Date: Sat, 14 Dec 2019 12:33:52 +0300 Subject: [PATCH 4/4] Update main.cpp --- 11-2/main.cpp | 51 --------------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/11-2/main.cpp b/11-2/main.cpp index a1f3957..991493f 100644 --- a/11-2/main.cpp +++ b/11-2/main.cpp @@ -88,54 +88,3 @@ int main() { return 0; } - - visited[x] = true; - } - if (dist[x] > dist[curr] + 1) { - dist[x] = dist[curr] + 1; - paths[x] = paths[curr]; - } - else if (dist[x] == dist[curr] + 1) - paths[x] += paths[curr]; - } - } - delete[] visited; -} - -int Graph::find_shortest_paths( int s, int n, int w ) { - int dist[n]; - int* paths = new int[n]; - for (int i = 0; i < n; i++) - dist[i] = INT_MAX; - for (int i = 0; i < n; i++) - paths[i] = 0; - BFS(adj, s, dist, paths, n); - int result = paths[w]; - delete[] paths; - return result; -} - -void Graph::add_edge( int u, int v ) { - adj[u].push_back(v); - adj[v].push_back(u); -} - -int main() { - int v_, n; - std::cin >> v_ >> n; - Graph g(v_); - for ( int i = 0; i < n; ++i ) { - int u, v; - std::cin >> u >> v; - g.add_edge( u, v ); - } - int v, w; - std::cin >> v >> w; - int result = g.find_shortest_paths( v, v_, w ); - cout << result << std::endl; - - return 0; -} - - -