Your program should take one of the following four commands from the standard input, and execute corresponding functions.
•S
•R
•W
•Pst
On reading S, the program stops.
On reading R, the program reads in an edge weighted directed graph from file GRAPHinput.txt to build the adjacency lists, and waits for the next command.
The file GRAPHinput.txt is a text file. The first line of the file contains two integers n and m, which indicates the number of vertices and the number of edges on the graph, respectively.
It is followed by m lines, where each line contains three integers: u,v, and w. These three integers indicate the information of an edge: there is an edge pointing from u to v, with weight w. Please note that the vertices of the graph are indexed from 1 to n (not from 0 to n - 1).
On reading W, the program writes the graph information to the screen, and waits for the next command.
The screen output format of W is as follows: The first line should contain two integers, n and m, where n is the number of vertices and m is the number of edges. It should be followed by n lines, where each of these n lines has the following format:
u : (v1 w1) (v2 w2) ... (vx, wx) 1
On reading P s t, the program runs Dijkstra's shortest path algorithm to compute a shortest s-t path, and prints out the shortest path information from s to t to the screen, and waits for the next command.
The screen output format of P s t is as follows: There are two lines. The first line contains an integer dist, which is the length of the shortest path computed. The next line contains the indexes of all vertices along the path direction, starting from src and ending with dest, in format of:
sv1 v2 ...t
Please note that your program should read in only one graph, but may be asked to compute s-t shortest paths for different pairs of s and t. Therefore, during the computation of the s-t shortest path, your program should not modify the given graph.
You should use modular design. At the minimum, you should have
• the main program as main.cpp and the corresponding main.h;
• the heap functions heap.cpp and the corresponding heap.h;
• the graph functions graph.cpp and the corresponding graph.h;
• various utility functions util.cpp and the corresponding util.h.
You should also provide a Makefile which compile the files into an executable file named run. Grading policies: (Sample test cases will be posted soon.)