$29
Assignment-1 [Total Marks = 90]
Graph Algorithms IMPORTANT: Read the instructions at the end of this document and follow the naming conventions. Marks for writing well structured and efficient code. [5 marks]
Q1. [22 marks] You are given a set of ‘n’ chemical compounds which have to be packed in two boxes. Some of the chemicals may react with other chemicals and should not be packed in the same box. 1. Code an efficient algorithm in C/C++ that determines if it is possible to safely pack these chemicals in two boxes and if so, then print which chemicals should go in Box-1 and which in Box-2. [8] 2. If it is not possible to safely pack the chemicals in two boxes then print at least one sequence of chemical interactions that prevents such a division. [8] 3. Give a clear description of your algorithm and the data structures used to implement it in the comments at the beginning of your code.Whatistherunningtimeofyour algorithm and how much space doesituse?Your should include clear comments that explain your algorithm’s time and space complexity. [2+1] 4. You should create at least three different input files to test your algorithm for different scenarios (see format below). [3]
Your code will read input from a text file. The format of the file is as follows. The first line contains the number of chemicals. This will be followed by n lines (one for each of the n chemicals) and each line will contain the chemical number followed by a colon and a comma separated list of chemicals with which it reacts. Some examples are given below. Input : n 6 C0: C1, C2 C1: C0, C3, C5 C2: C0 C3: C4, C1 C4: C3 C5: C1
Output Format: Yes C0, C3, C5 C1, C2, C4 ---------------------------
Input : n 6 C0: C1, C2
C1: C0, C3, C5 C2: C0, C4 C3: C4, C1 C4: C3, C2 C5: C1
Output Format: No C0-C1-C3-C4-C2-C0
Q2a.
[22 marks] A group of world leaders are attending a United Nations meeting. Some of the leaders hold a grudge against some of the others. You are given the set of world leaders and a set of ordered pairs (Li, Lj) of leaders such that Liholds a grudge against Lj.Note that the feeling is not mutual, i.e., Lj does not have a grudge against Li. The UN organizers have to take them to the meeting hall and they will be walking in a line down a passage. The organizers are afraid that Li might try to throw something at Lj’s back while they are in the line and want that those that hold a grudge (Li) are not somewhere behind those they grudge (Lj) in the line (note the phrase “somewhere behind in the line”). The organizers have asked you for help. 1. Code an efficient algorithm in C/C++ that prints a safe ordering of the leaders in the line or lets the organizers know that it is not possible. [8] 2. If a safe ordering is not possible then print at least one sequence of grudges to illustrate that. [8] 3. Give a clear description of your algorithm and the data structures used to implement it in the comments at the beginning of your code.Whatistherunningtimeofyour algorithm and how much space doesituse?Your should include clear comments that explain your algorithm’s time and space complexity. [2+1] 4. You should create at least three different input files to test your algorithm for different scenarios (see format below). [3]
Your code will read input from a text file. The format of the file is as follows. The first line contains the number of leaders. This will be followed by n lines (one for each of the n leaders) and each line will contain the leader number followed by a colon and a comma separated list of leaders they hold a grudge against. Some examples are given below. Input : n 5 L0: L1, L2, L3 L1: L3 L2: L1 L3: L4: L0
Output Format: Yes L4, L0, L2, L1, L3
------------------------- Input : n 5 L0: L1, L2, L3 L1: L3, L4 L2: L1 L3: L4: L0
Output Format: No L4-L0-L1-L4
Q2b. [10 marks] This part is a continuation of Q2a. Instead of lining up the leaders, you have to seat the leaders in rows while they are on the stage. Let's call the front row of the stage as Row-1 and second row as Row-2 and so-on. If Li holds a grudge against Lj then Li must be in a lower numbered row than Lj. Note: lengths of different rows (i.e. number of people sitting in that row) need not be the same. The organizers have asked you for help. 1. Code an efficient algorithm in C/C++ that finds the minimum number of rows needed. You have to print the number of rows and the order in which the leaders are seated in rows. If it is not possible to safely place the leaders in rows then mention that in the output. [7+1] 2. Give a clear description of your algorithm and the data structures used to implement it in the comments at the beginning of your code.The running time should not exceed that of Q2a. Your should include clear comments that explain your algorithm’s time and space complexity. [2] 3. You may reuse the input files you created in Q2a above to test your algorithm.
Input : n 5 L0: L1, L2, L3 L1: L3 L2: L3: L4: L0
Output Format: Yes 4 L4 L0 L1, L2 L3
----------------------- Input : n 5 L0: L1, L2, L3 L1: L3, L4 L2: L1 L3: L4: L0
Output Format: No
Q3. [16 marks] Consider a big road network. You are travelling from your home city (say city CA) to visit a friend in another city (say city CB) and you have figured out the shortest length path from CA to CB. Before leaving your home, you learn there is a scenic spot at city Cx and if you take a detour you can visit that before going to your friend’s place. Since you are driving and you don’t want to increase the distance you have to travel too much, you decide to only visit Cx if the shortest distance from CA to CB via Cx increases by no more than 20% of the shortest distance from CA to CB. 1. Code an efficient algorithm in C/C++ that determines if the distance from CA to CB via Cx is at most 20% more than the shortest distance from CA to CB. Your code will ask the user to input the values of CA, CB, and Cx (the cities are numbered from 0 to n-1, see format below). [6] 2. As output of your algorithm, print the following paths: (i) shortest path from CA to CB and its length, (ii) and the shortest path from CA to CB via Cx and its length. Use arrows(-) to separate your nodes. [4] 3. Give a clear description of your algorithm and the data structures used to implement it in the comments at the beginning of your code.Whatistherunningtimeofyour algorithm and how much space doesituse?Your should include clear comments that explain your algorithm’s time and space complexity. [2+1] 4. You should create at least three different input files to test your algorithm for different scenarios (see format below). [3]
Your code will read input from a text file. The problem will be modeled as a directed graph, where the vertices represent cities and the edges represent the roads that connect the cities. The direction on the edges represent that they are one-way roads. Each of the roads has a
length represented by a positive edge weight. The graph input file format is similar to Q1’s except for the addition of the edge weights. The graph nodes are numbered from C0 to Cn-1. The file will have the value of n on the first line. This will be followed by n lines (one for each of the n nodes in the graph) and each line will contain a node number (say Ci) followed by a colon and a comma separated list of nodes to which node i has an edge. The edge weights will be appended to each neighbor of i using a semicolon. For example, if there is an edge between node C0 and node C1 of weight 5 and edge between node C0 and node C5 of weight 2, then that will be represented as C0: C1;5, C5;2 An example is given below. Suppose user enters C0 as home city, C2 as friend’s city and C3 as the scenic spot.
n 6 C0: C1;5, C5;2, C3;3 C1: C4;1 C2: C3: C2;5 C4: C2;1 C5: C2;10
Asymptotic Complexity
Q4. [10 marks] Q4-i What is the asymptotic time complexity of the following program fragment. [2] Show your working. for (i=1; i<=n; i*=2) { j = i; } Q4-iia What is the asymptotic time complexity of the following program fragment. [3] Give both the upper bound and lower bound for this fragment. Show your working.
int x, y, n; ... /* P is a 1-D array of size n integers and W is a 2-D array of size n x n integers */ for (x=0; x<n; x++) { for (y=x+1; y<n; y++) { W[x][y] = func(P, x, y); } } ... The function func() called from the main program (above) is defined as follows: int func(int *array, int i, int j) { int ii, val=0; for (ii=i; ii<=j; ii++) { val += array[ii]; } return (val); }
Q4-iib What is being stored in the 2-D W array in Q4-iia? [2] Q4-iic The program fragment in Q4-iia is not very efficient. Rewrite it to improve its time complexity. [3]
Q5. [5 marks] You are given the following two nxn-dimensional matrices. The first matrix called “Intern Preference Matrix” stores information about n interns that want to apply for jobs at n different companies. Each row corresponds to one intern and indicates his/her order of preference for the employers. For example: Intern-1’s first preference is Employer-3, second preference is for Employer-1, third preference is Employer-5 and so-on.
The second matrix called “Employer Preference Matrix” stores preference information of each of the n employers for the intern applicants. For example: Employer-1’s first preference is Intern-2, second preference is for Intern-4 and so-on.
Intern Preference Matrix Intern 1 (I1) E3 E1 E5 E8 ... E2 Intern 2 (I2) E5 E2 E1 E7 ... E3 Intern 3 (I3) ... ... ... ... ... ... ... ... ... ... ... ... ... Intern n (In) ... ... ... ... ... ...
Employer Preference Matrix Employer 1 (E1) I2 I4 I5 I1 ... I3 Employer 2 (E2) I6 I2 I3 I4 ... I1 Employer 3 (E3) ... ... ... ... ... ... ... ... ... ... ... ... ... Employer n (En) ... ... ... ... ... ...
We have a number of queries such as “Does Ex prefer Ia over Ib?” or “Does Ix prefer Ey over Ez?” and we want to answer each query in O(1) time. How would you restructure/re-store the above information so that we can answer such queries in O(1) time? You are only allowed to use arrays. You cannot use other data structures such as hash tables, etc. Clearly explain your answer and thespacerequired by your solution.
Instructions and policies 1. You must submit your own work. You may discuss the problems with other classmates but must not reveal the solution to others or copy someone’s work. Remember to acknowledge other classmates if discussions with them has helped you. 2. You should name your code files using the following convention: Qx-rollno.c 3. Type your answer to the theoretical questions (Q4 & 5) and submit a separate pdf file for each using the naming convention above. 4. Upload all your files in Assignment-1 folder on LMS.Therewillbea20%deduction for assignments submitted up to one day late. Assignments submitted 24 hours after the deadline will not be marked. 5. There will be vivas during grading of the assignment. The TAs will announce a schedule and ask you to sign up for viva time slots. Failure to show up for vivas will result in a 70% marks reduction in the assignment. 6. For full credit, comment your code clearly and state any assumptions that you have made. As mentioned in the beginning of the assignment, there are marks for writing well-structured and efficient code.