/* #define NDEBUG */ #include /* #include */ #include /* #include */ /* #include */ #include /* #include */ /* #include */ /* #include */ /* #include */ /* #include */ #include using namespace std; template class adjacency_list { public: size_t N; std::vector> adj; adjacency_list (size_t n) { N = n; adj(N, std::vector()); } std::vector operator[](T i) { adj[i]; }; void add_directed_edge(size_t i, size_t j) { adj[i].push_back(j); }; void add_undirected_edge(size_t i, size_t j) { adj[i].push_back(j); adj[j].push_back(i); }; }; template std::vector> floyd_warshall(std::vector> adj); int main() { vector> adj_matrix; auto foo = floyd_warshall(adj_matrix); /* floyd_warshall(adj_matrix); */ ; return EXIT_SUCCESS; } #ifndef NDEBUG #endif // NOTE: !!!UNTESTED!!! // Time complexity: O(n^3) // Memory complexity: O(n^2) - only for n ~ 10^3 (n ~ 10^4 results in 1524 MB of memory) // Input: Graph as an adjancency matrix (weight 0 => no edge) // Output: A distance matrix (distance std::numeric_limits::max() => no path) #include #include #include #include template std::vector> floyd_warshall(std::vector> adj) { size_t n = adj.size(); std::vector> distance(n, std::vector(n, 0)); // Initialize distance for (size_t i = 0; i < n; i++) { for (size_t j = 0; j < n; j++) { if (i == j) distance[i][j] = 0; else if (adj[i][j]) distance[i][j] = adj[i][j]; else distance[i][j] = std::numeric_limits::max(); } } // Find shortest distances for (size_t k = 0; k < n; k++) { for (size_t i = 0; i < n; i++) { for (size_t j = 0; j < n; j++) { if (distance[i][k] == std::numeric_limits::max() || distance[k][j] == std::numeric_limits::max()) continue; distance[i][j] = std::min(distance[i][j], distance[i][k] + distance[k][j]); } } } return distance; } template class 1D_sum_queries { vector> array; public: 1D_sum_queries(size_t n) { } std::vector operator[](T i) { adj[i]; }; }