int64_t
INF= std::numeric_limits<int64_t>::max();
46void addEdge(std::vector<std::vector<std::pair<uint64_t, uint64_t>>> *adj1,
47std::vector<std::vector<std::pair<uint64_t, uint64_t>>> *adj2,
48uint64_t u, uint64_t v, uint64_t w) {
49(*adj1)[u - 1].push_back(std::make_pair(v - 1, w));
50(*adj2)[v - 1].push_back(std::make_pair(u - 1, w));
63 conststd::vector<uint64_t> &workset_,
64 conststd::vector<std::vector<uint64_t>> &distance_) {
65int64_t distance =
INF;
66 for(uint64_t i : workset_) {
67 if(distance_[0][i] + distance_[1][i] < distance) {
68distance = distance_[0][i] + distance_[1][i];
87int Bidijkstra(std::vector<std::vector<std::pair<uint64_t, uint64_t>>> *adj1,
88std::vector<std::vector<std::pair<uint64_t, uint64_t>>> *adj2,
89uint64_t s, uint64_t t) {
91uint64_t n = adj1->size();
94std::vector<std::vector<uint64_t>> dist(2, std::vector<uint64_t>(n,
INF));
103std::priority_queue<std::pair<uint64_t, uint64_t>,
104std::vector<std::pair<uint64_t, uint64_t>>,
105std::greater<std::pair<uint64_t, uint64_t>>>>
108std::vector<uint64_t> workset(n);
110std::vector<bool> visited(n);
113pq[0].push(std::make_pair(0, s));
119pq[1].push(std::make_pair(0, t));
129 if(pq[0].size() == 0) {
133uint64_t currentNode = pq[0].top().second;
136uint64_t currentDist = pq[0].top().first;
142 for(std::pair<int, int> edge : (*adj1)[currentNode]) {
144 if(currentDist + edge.second < dist[0][edge.first]) {
145dist[0][edge.first] = currentDist + edge.second;
146pq[0].push(std::make_pair(dist[0][edge.first], edge.first));
150workset.push_back(currentNode);
153 if(visited[currentNode] == 1) {
156visited[currentNode] =
true;
161 if(pq[1].size() == 0) {
165currentNode = pq[1].top().second;
168currentDist = pq[1].top().first;
174 for(std::pair<int, int> edge : (*adj2)[currentNode]) {
176 if(currentDist + edge.second < dist[1][edge.first]) {
177dist[1][edge.first] = currentDist + edge.second;
178pq[1].push(std::make_pair(dist[1][edge.first], edge.first));
182workset.push_back(currentNode);
185 if(visited[currentNode] == 1) {
188visited[currentNode] =
true;
201std::cout <<
"Initiatinig Predefined Tests..."<< std::endl;
202std::cout <<
"Initiating Test 1..."<< std::endl;
203std::vector<std::vector<std::pair<uint64_t, uint64_t>>> adj1_1(
2044, std::vector<std::pair<uint64_t, uint64_t>>());
205std::vector<std::vector<std::pair<uint64_t, uint64_t>>> adj1_2(
2064, std::vector<std::pair<uint64_t, uint64_t>>());
212uint64_t s = 1, t = 3;
215std::cout <<
"Test 1 Passed..."<< std::endl;
218std::cout <<
"Initiating Test 2..."<< std::endl;
221std::cout <<
"Test 2 Passed..."<< std::endl;
223std::vector<std::vector<std::pair<uint64_t, uint64_t>>> adj2_1(
2245, std::vector<std::pair<uint64_t, uint64_t>>());
225std::vector<std::vector<std::pair<uint64_t, uint64_t>>> adj2_2(
2265, std::vector<std::pair<uint64_t, uint64_t>>());
238std::cout <<
"Initiating Test 3..."<< std::endl;
241std::cout <<
"Test 3 Passed..."<< std::endl;
242std::cout <<
"All Test Passed..."<< std::endl << std::endl;
251uint64_t vertices = uint64_t();
252uint64_t edges = uint64_t();
253std::cout <<
"Enter the number of vertices : ";
254std::cin >> vertices;
255std::cout <<
"Enter the number of edges : ";
258std::vector<std::vector<std::pair<uint64_t, uint64_t>>> adj1(
259vertices, std::vector<std::pair<uint64_t, uint64_t>>());
260std::vector<std::vector<std::pair<uint64_t, uint64_t>>> adj2(
261vertices, std::vector<std::pair<uint64_t, uint64_t>>());
263uint64_t u = uint64_t(), v = uint64_t(), w = uint64_t();
264std::cout <<
"Enter the edges by three integers in this form: u v w " 266std::cout <<
"Example: if there is and edge between node 1 and node 4 with " 267 "weight 7 enter: 1 4 7, and then press enter" 270std::cin >> u >> v >> w;
273std::cout <<
"Enter the next edge"<< std::endl;
277uint64_t s = uint64_t(), t = uint64_t();
279<<
"Enter the source node and the target node separated by a space" 281std::cout <<
"Example: If the source node is 5 and the target node is 6 " 282 "enter: 5 6 and press enter" 288std::cout <<
"Target not reachable from source"<< std::endl;
290std::cout <<
"Shortest Path Distance : "<< dist << std::endl;
int Bidijkstra(std::vector< std::vector< std::pair< uint64_t, uint64_t > > > *adj1, std::vector< std::vector< std::pair< uint64_t, uint64_t > > > *adj2, uint64_t s, uint64_t t)
Function runs the dijkstra algorithm for some source vertex and target vertex in the graph and return...
uint64_t Shortest_Path_Distance(const std::vector< uint64_t > &workset_, const std::vector< std::vector< uint64_t > > &distance_)
This function returns the shortest distance from the source to the target if there is path between ve...
constexpr int64_t INF
for assert
static void tests()
Function to test the provided algorithm above.
void addEdge(std::vector< std::vector< std::pair< uint64_t, uint64_t > > > *adj1, std::vector< std::vector< std::pair< uint64_t, uint64_t > > > *adj2, uint64_t u, uint64_t v, uint64_t w)
Function that add edge between two nodes or vertices of graph.
int main()
Main function.
Functions for [Bidirectional Dijkstra Shortest Path] (https://www.coursera.org/learn/algorithms-on-gr...
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4