#include <stdio.h>
int main() {
int numProcesses = 5; // Number of processes
int numResources = 3; // Number of resources
int allocationMatrix[5][3] = {{0, 1, 0}, {2, 0, 0}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2}}; // Allocation Matrix
int maxMatrix[5][3] = {{7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3}}; // MAX Matrix
int availableResources[3] = {3, 3, 2}; // Available Resources
int isFinished[numProcesses], safeSequence[numProcesses], index = 0;
for (int k = 0; k < numProcesses; k++) {
isFinished[k] = 0;
}
int needMatrix[numProcesses][numResources];
for (int i = 0; i < numProcesses; i++) {
for (int j = 0; j < numResources; j++)
needMatrix[i][j] = maxMatrix[i][j] - allocationMatrix[i][j];
}
for (int k = 0; k < numProcesses; k++) {
for (int i = 0; i < numProcesses; i++) {
if (isFinished[i] == 0) {
int flag = 0;
for (int j = 0; j < numResources; j++) {
if (needMatrix[i][j] > availableResources[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
safeSequence[index++] = i;
for (int y = 0; y < numResources; y++)
availableResources[y] += allocationMatrix[i][y];
isFinished[i] = 1;
}
}
}
}
int flag = 1;
for (int i = 0; i < numProcesses; i++) {
if (isFinished[i] == 0) {
flag = 0;
printf("The system is not safe.\n");
break;
}
}
if (flag == 1) {
printf("SAFE Sequence: ");
for (int i = 0; i < numProcesses - 1; i++)
printf("P%d -> ", safeSequence[i]);
printf("P%d\n", safeSequence[numProcesses - 1]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgbWFpbigpIHsKICAgIGludCBudW1Qcm9jZXNzZXMgPSA1OyAvLyBOdW1iZXIgb2YgcHJvY2Vzc2VzCiAgICBpbnQgbnVtUmVzb3VyY2VzID0gMzsgLy8gTnVtYmVyIG9mIHJlc291cmNlcwoKICAgIGludCBhbGxvY2F0aW9uTWF0cml4WzVdWzNdID0ge3swLCAxLCAwfSwgezIsIDAsIDB9LCB7MywgMCwgMn0sIHsyLCAxLCAxfSwgezAsIDAsIDJ9fTsgLy8gQWxsb2NhdGlvbiBNYXRyaXgKICAgIGludCBtYXhNYXRyaXhbNV1bM10gPSB7ezcsIDUsIDN9LCB7MywgMiwgMn0sIHs5LCAwLCAyfSwgezIsIDIsIDJ9LCB7NCwgMywgM319OyAgIC8vIE1BWCBNYXRyaXgKICAgIGludCBhdmFpbGFibGVSZXNvdXJjZXNbM10gPSB7MywgMywgMn07IC8vIEF2YWlsYWJsZSBSZXNvdXJjZXMKCiAgICBpbnQgaXNGaW5pc2hlZFtudW1Qcm9jZXNzZXNdLCBzYWZlU2VxdWVuY2VbbnVtUHJvY2Vzc2VzXSwgaW5kZXggPSAwOwogICAgZm9yIChpbnQgayA9IDA7IGsgPCBudW1Qcm9jZXNzZXM7IGsrKykgewogICAgICAgIGlzRmluaXNoZWRba10gPSAwOwogICAgfQoKICAgIGludCBuZWVkTWF0cml4W251bVByb2Nlc3Nlc11bbnVtUmVzb3VyY2VzXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUHJvY2Vzc2VzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVJlc291cmNlczsgaisrKQogICAgICAgICAgICBuZWVkTWF0cml4W2ldW2pdID0gbWF4TWF0cml4W2ldW2pdIC0gYWxsb2NhdGlvbk1hdHJpeFtpXVtqXTsKICAgIH0KCiAgICBmb3IgKGludCBrID0gMDsgayA8IG51bVByb2Nlc3NlczsgaysrKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Qcm9jZXNzZXM7IGkrKykgewogICAgICAgICAgICBpZiAoaXNGaW5pc2hlZFtpXSA9PSAwKSB7CiAgICAgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVJlc291cmNlczsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRNYXRyaXhbaV1bal0gPiBhdmFpbGFibGVSZXNvdXJjZXNbal0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDApIHsKICAgICAgICAgICAgICAgICAgICBzYWZlU2VxdWVuY2VbaW5kZXgrK10gPSBpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUmVzb3VyY2VzOyB5KyspCiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVJlc291cmNlc1t5XSArPSBhbGxvY2F0aW9uTWF0cml4W2ldW3ldOwogICAgICAgICAgICAgICAgICAgIGlzRmluaXNoZWRbaV0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGludCBmbGFnID0gMTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUHJvY2Vzc2VzOyBpKyspIHsKICAgICAgICBpZiAoaXNGaW5pc2hlZFtpXSA9PSAwKSB7CiAgICAgICAgICAgIGZsYWcgPSAwOwogICAgICAgICAgICBwcmludGYoIlRoZSBzeXN0ZW0gaXMgbm90IHNhZmUuXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChmbGFnID09IDEpIHsKICAgICAgICBwcmludGYoIlNBRkUgU2VxdWVuY2U6ICIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUHJvY2Vzc2VzIC0gMTsgaSsrKQogICAgICAgICAgICBwcmludGYoIlAlZCAtPiAiLCBzYWZlU2VxdWVuY2VbaV0pOwogICAgICAgIHByaW50ZigiUCVkXG4iLCBzYWZlU2VxdWVuY2VbbnVtUHJvY2Vzc2VzIC0gMV0pOwogICAgfQoKICAgIHJldHVybiAwOwp9