import java.util.*;
public class deadlock {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter number of processes: ");
int n = sc.nextInt();
System.out.print("Enter number of resources: ");
int m = sc.nextInt();
int[][] Max = new int[n][m];
int[][] Allocation = new int[n][m];
int[][] Need = new int[n][m];
int[] Available = new int[m];
System.out.println("Enter Max matrix:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Max[i][j] = sc.nextInt();
}
}
// Allocation matrix
System.out.println("Enter Allocation matrix:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Allocation[i][j] = sc.nextInt();
}
}
System.out.println("Enter Available resources:");
for (int j = 0; j < m; j++) {
Available[j] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Need[i][j] = Max[i][j] - Allocation[i][j];
}
}
System.out.println("\\nProcess\\tAllocation\\tMax\\t\\tNeed");
for (int i = 0; i < n; i++) {
System.out.print("P" + i + "\\t");
for (int j = 0; j < m; j++) {
System.out.print(Allocation[i][j] + " ");
}
System.out.print("\\t\\t");
for (int j = 0; j < m; j++) {
System.out.print(Max[i][j] + " ");
}
System.out.print("\\t\\t");
for (int j = 0; j < m; j++) {
System.out.print(Need[i][j] + " ");
}
System.out.println();
}
int[] currAvail = Arrays.copyOf(Available, m);
System.out.println("\\nInitial Available resources:");
for (int j = 0; j < m; j++) {
System.out.print(currAvail[j] + " ");
}
System.out.println();
boolean[] finished = new boolean[n];
int count = 0;
List<Integer> safeSequence = new ArrayList<>();
while (count < n) {
boolean found = false;
for (int i = 0; i < n; i++) {
if (!finished[i]) {
int j;
for (j = 0; j < m; j++) {
if (Need[i][j] > currAvail[j]) {
break;
}
}
if (j == m) {
System.out.println("Process " + i + " is executed.");
for (int k = 0; k < m; k++) {
currAvail[k] += Allocation[i][k];
}
System.out.print("Available after executing P" + i + ": ");
for (int k = 0; k < m; k++) {
System.out.print(currAvail[k] + " ");
}
System.out.println();
finished[i] = true;
count++;
found = true;
safeSequence.add(i);
}
}
}
if (!found) {
System.out.println("\\nDeadlock detected!");
break;
}
}
if (count == n) {
System.out.println("\\nSystem is in a safe state. No Deadlock!");
System.out.print("Safe Sequence: ");
for (int i = 0; i < safeSequence.size(); i++) {
System.out.print("P" + safeSequence.get(i));
if (i != safeSequence.size() - 1) {
System.out.print(" -> ");
}
}
System.out.println();
}
}
}

