Here in the great State of Ohio, each city is connected to at least one other city
by at least one bi-directional road. In other words, Ohio is laid out as an undirected
graph with some vertices sharing multiple (parallel) edges. Now the State is working
to install recharging stations for electric cars in every city. Your job is to help find the
minimum battery range needed to travel between any two cities in Ohio. Specifically,
what you need to do is first calculate a minimum spanning tree (MST) among
the Ohio cities and then identify within that minimum spanning tree the road with
the longest distance (i.e., the longest edge in the MST). Given this information,
car companies can fine tune their car batteries to ensure that no driver is left stranded
with a dead car battery outside a city.
Implementation and Bonus:
In order to find a minimum spanning tree, you must implement the Prim’s algorithm described on page 728 in the textbook. This is the algorithm described in
Thursday’s lecture, where the details are shown in the attached lecture PPT.
If you recall, this algorithm runs in O(V + V
2 + E) time, where V is the number
of vertices in the graph and E is the number of edges. The O(V
) component refers
to the time taken to find every unvisited, minimum weight vertex at the start of the
while loop. The O(E) component results from comparing and possibly updating the
weights of all nodes adjacent to the minimum weight vertices selected at the start
of the while loop. In other words, the for loop within the while loop runs O(E)
operations in total.
If your graph is not too dense (meaning the graph does not contain an overwhelming number of edges), you may want to consider storing the set of unvisited vertices
in a min heap. This will help you find all the mininum weight vertices at the start
of the while loop in O(V log(V )) time as opposed to O(V
) time. Of course, when
you now update the weight of a neighboring vertex in the for loop below, you must
also update that vertex’s position in the min heap. As you already know, bubbling
up an element in a min heap of n elements takes just O(log(n)) time, but the initial
searching takes O(n) time. In order to avoid the O(n) search, you must implement
a lookup table that returns a vertex’s index in the min heap in O(1) time. If implemented correctly, the overall time complexity of updating the weight values of
vertices throughout the entire run of the min heap Prim’s algorithm is O(Elog(V )).
In other words, using a lookup table and a min heap, the for loop within the while
loop runs O(Elog(V )) operations in total as opposed the O(E) time in the Prim’s
algorithm described in the previous paragraph. Thus, the total time complexity of
this modified Prim’s algorithm is O(V log(V ) + Elog(V )). As said early, it is more
advantageous to use the min heap version if your graph is not overwhelmingly dense.
In this project, the 6 final grade points will be awarded if you successfully implement the Prim’s algorithm described on page 728 in your textbook. If you successfully
implement the min heap version, you will be awarded the 6 final grade points plus 3
Please note that the Prim2(G, W, n, s) function on page 728 has several
typos. The corrected version can be found in the lecture notes attached
in this assignment.
The input may seem a little strange, so let me explain carefully. The first line of
each input file is the number of test cases T. Each test case is a new graph and thus a
new problem. The first line of each test case is the number of cities N and number of
roads M. The cities are conveniently labeled with integers ranging from 0 to N − 1.
Following the city and road counts are M lines describing the M roads. Each road is
defined as a pair of cities along with the distance between those cities. Remember,
two cities can be connected by more than one road and each road is bi-directional
(undirected). Here is an example:
0 1 5
1 2 7
0 1 100
1 2 110
1 2 104
2 1 120
The first line indicates the number of test cases T, which in this example is 2. In
the first test case N = 3 and M = 2. So there exists 3 cities and 2 undirected roads
in this graph. Following are the 2 lines describing the roads. The first road connects
city 0 and city 1 and has a length of 5. The second road connects city 1 and city 2
and has a length of 7. After printing out the minimum spanning tree and battery
range for this graph, you will move on to the second test case which has N = 3 cities
and M = 4 roads. Following are the 4 lines describing the 4 roads. Notice that three
roads connect cities 1 and 2. Two of these roads are listed as (1, 2), the other is listed
as (2, 1). Do not be confused by this. You are working with an undirected graph, so
(1, 2) is the same as listing (2, 1).
I will always test with graphs that have a minimum spanning tree. So you should
always make sure every city in your own test files have at least one road connecting
it to another city.
For each test case, print the longest road of the minimum spanning tree on one
line followed by the minimum spanning tree itself. The output for the example given
above is as follows:
In the first test case, the longest road in the minimum spanning tree is 7, which
lies between cities 1 and 2. So the minimum battery range will be calculated based
on distance 7. Following is the minimum spanning tree which contains only two
roads. These roads lie between cities 1 and 0 with weight 5 and cities 2 and 1 with
weight 7. 104 is the longest road in the second test case. The 2 roads are listed last.
Remember, you should only have N − 1 roads in your minimum spanning trees. DO
NOT worry if the cities in your edges are ordered differently. ‘(0,1,100)’ is the
same thing as ‘(1,0,100)’. Also, DO NOT worry if you end up with a different
minimum spanning tree. Just make sure that it is in fact a minimum spanning tree
though. They all share the same edge weight total.
Submissions will be made through blackboard. If you have multiple files, package
them into a compressed tar file (.tar.gz) or zip file.
Total: 100 pts.
• 10/100 – Code style, commenting, general readability.
• 05/100 – Compiles successfully.
• 05/100 – Follows provided input and output format.
• 80/100 – Successfully found the max road length and minimum spanning tree.