You are given a weighted, undirected graph with ‘V’ vertices numbered from 1 to ‘V’ and ‘E’ bidirectional edges.
You have to answer ‘Q’ queries. Every query has two integers, ‘u’, ‘v’, representing the vertices. Your task is to print the shortest distance between ‘u’ and ‘v’ and print -1 if there is no path.
For example:
For the given graph, we have to find the shortest distance between vertices 1 and 3.
The shortest distance between 1 and 3 is 2 (via 1 <-> 2<-> 3). Hence, the answer is 2.
The first line of the input contains an integer, 'T,’ denoting the number of test cases.
The first line of each test case contains three integers ‘V’, ‘E’, ‘Q’, denoting the number of vertices, the number of edges in the graph, and the number of queries.
The Next ‘E’ lines of each test case have three integers ‘u’,’v’,’w’ corresponding to vertices ‘u’ and ‘v’ are connected with a weight ‘w’.
The Next ‘Q’ lines of each test case have two integers, ‘u’,’v’ representing two vertices.
Output Format:
For each test case, print ‘Q’ lines, each line has one integer corresponding to the minimum distance for the given query.
Print the output of each test case in a separate line.
Note:
You do not need to print anything. It has already been taken care of. Just implement the given function.
1 <= T <= 5
1 <= V <= 100
1 <= E <= (V *(V - 1)) / 2
1 <= Q <= 10^5
1 <= u , v <= V
1 <= w <= 10^6
Time limit: 1 sec
2
3 3 1
1 2 1
2 3 1
1 3 5
1 3
4 3 2
1 2 1
2 3 5
1 3 3
2 4
1 3
2
-1
3
For the first test case,
The shortest distance between 1 and 3 is 2 (via 1 <-> 2<-> 3). Hence, the answer is 2.
For the second test case,
For the first query, -1 because vertex 4 is unreachable from vertex 2. Hence, the answer is -1.
For the second query, The shortest distance between 1 and 3 is 3 (via 1<-> 3). Hence, the answer is 3.
2
4 3 1
1 2 1
2 3 10
4 1 5
1 1
4 2 2
1 3 3
1 2 1
2 3
4 2
0
4
-1
Can you use any algorithm for a single-source shortest path?
We will run Dijkstra Algorithm for all vertices in this approach and store the minimum distance in an array. Then we can answer the queries using this distance array.
Dijkstra Algorithm is one of the most popular algorithms in graph theory. A single-source shortest path algorithm gives the shortest path length to all vertices from a given vertex known as the source vertex. It is a greedy algorithm that uses a priority queue(Binary Heap) to pick the shortest distance edges until the minimum distance of all vertices is calculated.
Algorithm:
O(V*(V+E)*log(V) + Q), where V and E are the numbers of vertices and edges in the graph, and Q is the number of queries.
The time complexity of insert, delete operation on priority queue is O(log(V)).
The time complexity of the Dijkstra Algorithm:
V times delete operation while extracting the minimum value vertex :O(V *log(V))
E times insert operation while traversing neighbor vertices: O(E*log(V))
So,the total time complexity of Dijkstra Algorithm is O((V+E)*log(V)).
We are running Dijkstra Algorithm V times and answering Q queries, and each query takes O(1) time. Hence the overall time complexity will be O(V*(V+E)*log(V) +Q).
O(V^2), where V is the number of vertices in the graph.
The O(V^2) space is used to store the minimum distance between all pairs of vertices, and in total, there are V*V=V^2 pairs. The adjacency matrix also requires the O(V^2) space. Hence, the overall space complexity is O(V^2).