formatting source-code for 56556a81fb

This commit is contained in:
github-actions
2020-07-17 14:27:01 +00:00
parent 56556a81fb
commit 541d3bfbcf

View File

@@ -37,31 +37,31 @@ constexpr long long INF = 1000000000;
*/ */
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();
@@ -72,9 +72,9 @@ 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
pq.push(std::make_pair(0, s)); pq.push(std::make_pair(0, s));
@@ -82,96 +82,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(4, std::vector<std::pair<int, int>>()); std::vector<std::vector<std::pair<int, int>>> adj1(
graph::addEdge(&adj1, 1, 2, 1); 4, std::vector<std::pair<int, int>>());
graph::addEdge(&adj1, 4, 1, 2); graph::addEdge(&adj1, 1, 2, 1);
graph::addEdge(&adj1, 2, 3, 2); graph::addEdge(&adj1, 4, 1, 2);
graph::addEdge(&adj1, 1, 3, 5); graph::addEdge(&adj1, 2, 3, 2);
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(5, std::vector<std::pair<int, int>>()); std::vector<std::vector<std::pair<int, int>>> adj2(
graph::addEdge(&adj2, 1, 2, 4); 5, std::vector<std::pair<int, int>>());
graph::addEdge(&adj2, 1, 3, 2); graph::addEdge(&adj2, 1, 2, 4);
graph::addEdge(&adj2, 2, 3, 2); graph::addEdge(&adj2, 1, 3, 2);
graph::addEdge(&adj2, 3, 2, 1); graph::addEdge(&adj2, 2, 3, 2);
graph::addEdge(&adj2, 2, 4, 2); graph::addEdge(&adj2, 3, 2, 1);
graph::addEdge(&adj2, 3, 5, 4); graph::addEdge(&adj2, 2, 4, 2);
graph::addEdge(&adj2, 5, 4, 1); graph::addEdge(&adj2, 3, 5, 4);
graph::addEdge(&adj2, 2, 5, 3); graph::addEdge(&adj2, 5, 4, 1);
graph::addEdge(&adj2, 3, 4, 4); graph::addEdge(&adj2, 2, 5, 3);
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, edges; int vertices, edges;
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, v, w; int u, v, w;
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, t; int s, t;
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;
} }