diff --git a/11-2/main.cpp b/11-2/main.cpp index b8e507b..991493f 100644 --- a/11-2/main.cpp +++ b/11-2/main.cpp @@ -5,3 +5,86 @@ Вывод: количество кратчайших путей от v к w. ссылка на Яндекс.Контест https://contest.yandex.ru/contest/15957/run-report/27592154/ + +#include +#include +#include +#include +#include +#include +#include +#define INT_MAX 2147483647 + +using std::list; +using std::vector; +using std::queue; +using std::cout; + +class Graph { +public: + Graph(int v): v(v) { adj.assign(v, {}); }; + 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( int src, vector& dist, vector& paths, int n ) const { + vector visited( n, 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]; + } + } +} + +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; +} +