mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
fix: clang-format for dijkstra (#1055)
This commit is contained in:
parent
79fb528dad
commit
eee5f9495d
@ -26,10 +26,10 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <memory>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
constexpr int64_t INF = std::numeric_limits<int64_t>::max();
|
constexpr int64_t INF = std::numeric_limits<int64_t>::max();
|
||||||
|
|
||||||
@ -39,31 +39,31 @@ constexpr int64_t INF = std::numeric_limits<int64_t>::max();
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
namespace graph {
|
namespace graph {
|
||||||
/**
|
/**
|
||||||
* @brief Function that add edge between two nodes or vertices of graph
|
* @brief Function that add edge between two nodes or vertices of graph
|
||||||
*
|
*
|
||||||
* @param u any node or vertex of graph
|
* @param u any node or vertex of graph
|
||||||
* @param v any node or vertex of graph
|
* @param v any node or vertex of graph
|
||||||
*/
|
*/
|
||||||
void addEdge(std::vector<std::vector<std::pair<int, int>>> *adj, int u, int v,
|
void addEdge(std::vector<std::vector<std::pair<int, int>>> *adj, int u, int v,
|
||||||
int w) {
|
int w) {
|
||||||
(*adj)[u - 1].push_back(std::make_pair(v - 1, w));
|
(*adj)[u - 1].push_back(std::make_pair(v - 1, w));
|
||||||
// (*adj)[v - 1].push_back(std::make_pair(u - 1, w));
|
// (*adj)[v - 1].push_back(std::make_pair(u - 1, w));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Function runs the dijkstra algorithm for some source vertex and
|
* @brief Function runs the dijkstra algorithm for some source vertex and
|
||||||
* target vertex in the graph and returns the shortest distance of target
|
* target vertex in the graph and returns the shortest distance of target
|
||||||
* from the source.
|
* from the source.
|
||||||
*
|
*
|
||||||
* @param adj input graph
|
* @param adj input graph
|
||||||
* @param s source vertex
|
* @param s source vertex
|
||||||
* @param t target vertex
|
* @param t target vertex
|
||||||
*
|
*
|
||||||
* @return shortest distance if target is reachable from source else -1 in
|
* @return shortest distance if target is reachable from source else -1 in
|
||||||
* case if target is not reachable from source.
|
* case if target is not reachable from source.
|
||||||
*/
|
*/
|
||||||
int dijkstra(std::vector<std::vector<std::pair<int, int>>> *adj, int s, int t) {
|
int dijkstra(std::vector<std::vector<std::pair<int, int>>> *adj, int s, int t) {
|
||||||
/// n denotes the number of vertices in graph
|
/// n denotes the number of vertices in graph
|
||||||
int n = adj->size();
|
int n = adj->size();
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ namespace graph {
|
|||||||
/// first element of pair contains the distance
|
/// first element of pair contains the distance
|
||||||
/// second element of pair contains the vertex
|
/// second element of pair contains the vertex
|
||||||
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
|
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
|
||||||
std::greater<std::pair<int, int>>>
|
std::greater<std::pair<int, int>>>
|
||||||
pq;
|
pq;
|
||||||
|
|
||||||
/// pushing the source vertex 's' with 0 distance in min heap
|
/// pushing the source vertex 's' with 0 distance in min heap
|
||||||
@ -84,97 +84,97 @@ namespace graph {
|
|||||||
dist[s] = 0;
|
dist[s] = 0;
|
||||||
|
|
||||||
while (!pq.empty()) {
|
while (!pq.empty()) {
|
||||||
/// second element of pair denotes the node / vertex
|
/// second element of pair denotes the node / vertex
|
||||||
int currentNode = pq.top().second;
|
int currentNode = pq.top().second;
|
||||||
|
|
||||||
/// first element of pair denotes the distance
|
/// first element of pair denotes the distance
|
||||||
int currentDist = pq.top().first;
|
int currentDist = pq.top().first;
|
||||||
|
|
||||||
pq.pop();
|
pq.pop();
|
||||||
|
|
||||||
/// for all the reachable vertex from the currently exploring vertex
|
/// for all the reachable vertex from the currently exploring vertex
|
||||||
/// we will try to minimize the distance
|
/// we will try to minimize the distance
|
||||||
for (std::pair<int, int> edge : (*adj)[currentNode]) {
|
for (std::pair<int, int> edge : (*adj)[currentNode]) {
|
||||||
/// minimizing distances
|
/// minimizing distances
|
||||||
if (currentDist + edge.second < dist[edge.first]) {
|
if (currentDist + edge.second < dist[edge.first]) {
|
||||||
dist[edge.first] = currentDist + edge.second;
|
dist[edge.first] = currentDist + edge.second;
|
||||||
pq.push(std::make_pair(dist[edge.first], edge.first));
|
pq.push(std::make_pair(dist[edge.first], edge.first));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (dist[t] != INF) {
|
if (dist[t] != INF) {
|
||||||
return dist[t];
|
return dist[t];
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} // namespace graph
|
} // namespace graph
|
||||||
|
|
||||||
/** Function to test the Algorithm */
|
/** Function to test the Algorithm */
|
||||||
void tests() {
|
void tests() {
|
||||||
std::cout << "Initiatinig Predefined Tests..." << std::endl;
|
std::cout << "Initiatinig Predefined Tests..." << std::endl;
|
||||||
std::cout << "Initiating Test 1..." << std::endl;
|
std::cout << "Initiating Test 1..." << std::endl;
|
||||||
std::vector<std::vector<std::pair<int, int>>> adj1(
|
std::vector<std::vector<std::pair<int, int>>> adj1(
|
||||||
4, std::vector<std::pair<int, int>>());
|
4, std::vector<std::pair<int, int>>());
|
||||||
graph::addEdge(&adj1, 1, 2, 1);
|
graph::addEdge(&adj1, 1, 2, 1);
|
||||||
graph::addEdge(&adj1, 4, 1, 2);
|
graph::addEdge(&adj1, 4, 1, 2);
|
||||||
graph::addEdge(&adj1, 2, 3, 2);
|
graph::addEdge(&adj1, 2, 3, 2);
|
||||||
graph::addEdge(&adj1, 1, 3, 5);
|
graph::addEdge(&adj1, 1, 3, 5);
|
||||||
|
|
||||||
int s = 1, t = 3;
|
int s = 1, t = 3;
|
||||||
assert(graph::dijkstra(&adj1, s - 1, t - 1) == 3);
|
assert(graph::dijkstra(&adj1, s - 1, t - 1) == 3);
|
||||||
std::cout << "Test 1 Passed..." << std::endl;
|
std::cout << "Test 1 Passed..." << std::endl;
|
||||||
|
|
||||||
s = 4, t = 3;
|
s = 4, t = 3;
|
||||||
std::cout << "Initiating Test 2..." << std::endl;
|
std::cout << "Initiating Test 2..." << std::endl;
|
||||||
assert(graph::dijkstra(&adj1, s - 1, t - 1) == 5);
|
assert(graph::dijkstra(&adj1, s - 1, t - 1) == 5);
|
||||||
std::cout << "Test 2 Passed..." << std::endl;
|
std::cout << "Test 2 Passed..." << std::endl;
|
||||||
|
|
||||||
std::vector<std::vector<std::pair<int, int>>> adj2(
|
std::vector<std::vector<std::pair<int, int>>> adj2(
|
||||||
5, std::vector<std::pair<int, int>>());
|
5, std::vector<std::pair<int, int>>());
|
||||||
graph::addEdge(&adj2, 1, 2, 4);
|
graph::addEdge(&adj2, 1, 2, 4);
|
||||||
graph::addEdge(&adj2, 1, 3, 2);
|
graph::addEdge(&adj2, 1, 3, 2);
|
||||||
graph::addEdge(&adj2, 2, 3, 2);
|
graph::addEdge(&adj2, 2, 3, 2);
|
||||||
graph::addEdge(&adj2, 3, 2, 1);
|
graph::addEdge(&adj2, 3, 2, 1);
|
||||||
graph::addEdge(&adj2, 2, 4, 2);
|
graph::addEdge(&adj2, 2, 4, 2);
|
||||||
graph::addEdge(&adj2, 3, 5, 4);
|
graph::addEdge(&adj2, 3, 5, 4);
|
||||||
graph::addEdge(&adj2, 5, 4, 1);
|
graph::addEdge(&adj2, 5, 4, 1);
|
||||||
graph::addEdge(&adj2, 2, 5, 3);
|
graph::addEdge(&adj2, 2, 5, 3);
|
||||||
graph::addEdge(&adj2, 3, 4, 4);
|
graph::addEdge(&adj2, 3, 4, 4);
|
||||||
|
|
||||||
s = 1, t = 5;
|
s = 1, t = 5;
|
||||||
std::cout << "Initiating Test 3..." << std::endl;
|
std::cout << "Initiating Test 3..." << std::endl;
|
||||||
assert(graph::dijkstra(&adj2, s - 1, t - 1) == 6);
|
assert(graph::dijkstra(&adj2, s - 1, t - 1) == 6);
|
||||||
std::cout << "Test 3 Passed..." << std::endl;
|
std::cout << "Test 3 Passed..." << std::endl;
|
||||||
std::cout << "All Test Passed..." << std::endl << std::endl;
|
std::cout << "All Test Passed..." << std::endl << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Main function */
|
/** Main function */
|
||||||
int main() {
|
int main() {
|
||||||
// running predefined tests
|
// running predefined tests
|
||||||
tests();
|
tests();
|
||||||
|
|
||||||
int vertices = int(), edges = int();
|
int vertices = int(), edges = int();
|
||||||
std::cout << "Enter the number of vertices : ";
|
std::cout << "Enter the number of vertices : ";
|
||||||
std::cin >> vertices;
|
std::cin >> vertices;
|
||||||
std::cout << "Enter the number of edges : ";
|
std::cout << "Enter the number of edges : ";
|
||||||
std::cin >> edges;
|
std::cin >> edges;
|
||||||
|
|
||||||
std::vector<std::vector<std::pair<int, int>>> adj(
|
std::vector<std::vector<std::pair<int, int>>> adj(
|
||||||
vertices, std::vector<std::pair<int, int>>());
|
vertices, std::vector<std::pair<int, int>>());
|
||||||
|
|
||||||
int u = int(), v = int(), w = int();
|
int u = int(), v = int(), w = int();
|
||||||
while (edges--) {
|
while (edges--) {
|
||||||
std::cin >> u >> v >> w;
|
std::cin >> u >> v >> w;
|
||||||
graph::addEdge(&adj, u, v, w);
|
graph::addEdge(&adj, u, v, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
int s = int(), t = int();
|
int s = int(), t = int();
|
||||||
std::cin >> s >> t;
|
std::cin >> s >> t;
|
||||||
int dist = graph::dijkstra(&adj, s - 1, t - 1);
|
int dist = graph::dijkstra(&adj, s - 1, t - 1);
|
||||||
if (dist == -1) {
|
if (dist == -1) {
|
||||||
std::cout << "Target not reachable from source" << std::endl;
|
std::cout << "Target not reachable from source" << std::endl;
|
||||||
} else {
|
} else {
|
||||||
std::cout << "Shortest Path Distance : " << dist << std::endl;
|
std::cout << "Shortest Path Distance : " << dist << std::endl;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user