#include <iostream>
using namespace std;
const int P = 5; // Number of processes
const int R = 3; // Number of resources
// Function to find the safe sequence
void findSafeSequence(int processes[], int available[], int max[][R], int allot[][R]) {
int need[P][R];
// Calculate need matrix
for (int i = 0; i < P; i++)
for (int j = 0; j < R; j++)
need[i][j] = max[i][j] - allot[i][j];
bool finish[P] = {false};
int safeSeq[P];
int work[R];
for (int i = 0; i < R; i++)
work[i] = available[i];
int count = 0;
while (count < P) {
bool found = false;
for (int p = 0; p < P; p++) {
if (!finish[p]) {
bool canRun = true;
for (int j = 0; j < R; j++) {
if (need[p][j] > work[j]) {
canRun = false;
break;
}
}
if (canRun) {
for (int k = 0; k < R; k++)
work[k] += allot[p][k];
safeSeq[count++] = p;
finish[p] = true;
found = true;
}
}
}
if (!found) {
cout << "System is in an unsafe state. No safe sequence exists.\n";
return;
}
}
cout << "System is in a safe state.\nSafe sequence is: ";
for (int i = 0; i < P; i++)
cout << "P" << safeSeq[i] << " ";
cout << endl;
}
int main() {
int processes[] = {0, 1, 2, 3, 4};
int available[R] = {3, 3, 2};
int max[P][R] = {
{7, 5, 3},
{3, 2, 2},
{9, 0, 2},
{2, 2, 2},
{4, 3, 3}
};
int allot[P][R] = {
{0, 1, 0},
{2, 0, 0},
{3, 0, 2},
{2, 1, 1},
{0, 0, 2}
};
findSafeSequence(processes, available, max, allot);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IFAgPSA1OyAvLyBOdW1iZXIgb2YgcHJvY2Vzc2VzCmNvbnN0IGludCBSID0gMzsgLy8gTnVtYmVyIG9mIHJlc291cmNlcwoKLy8gRnVuY3Rpb24gdG8gZmluZCB0aGUgc2FmZSBzZXF1ZW5jZQp2b2lkIGZpbmRTYWZlU2VxdWVuY2UoaW50IHByb2Nlc3Nlc1tdLCBpbnQgYXZhaWxhYmxlW10sIGludCBtYXhbXVtSXSwgaW50IGFsbG90W11bUl0pIHsKICAgIGludCBuZWVkW1BdW1JdOwoKICAgIC8vIENhbGN1bGF0ZSBuZWVkIG1hdHJpeAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQOyBpKyspCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBSOyBqKyspCiAgICAgICAgICAgIG5lZWRbaV1bal0gPSBtYXhbaV1bal0gLSBhbGxvdFtpXVtqXTsKCiAgICBib29sIGZpbmlzaFtQXSA9IHtmYWxzZX07CiAgICBpbnQgc2FmZVNlcVtQXTsKICAgIGludCB3b3JrW1JdOwogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IFI7IGkrKykKICAgICAgICB3b3JrW2ldID0gYXZhaWxhYmxlW2ldOwoKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBQKSB7CiAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgUDsgcCsrKSB7CiAgICAgICAgICAgIGlmICghZmluaXNoW3BdKSB7CiAgICAgICAgICAgICAgICBib29sIGNhblJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFI7IGorKykgewogICAgICAgICAgICAgICAgICAgIGlmIChuZWVkW3BdW2pdID4gd29ya1tqXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYW5SdW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjYW5SdW4pIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IFI7IGsrKykKICAgICAgICAgICAgICAgICAgICAgICAgd29ya1trXSArPSBhbGxvdFtwXVtrXTsKCiAgICAgICAgICAgICAgICAgICAgc2FmZVNlcVtjb3VudCsrXSA9IHA7CiAgICAgICAgICAgICAgICAgICAgZmluaXNoW3BdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgY291dCA8PCAiU3lzdGVtIGlzIGluIGFuIHVuc2FmZSBzdGF0ZS4gTm8gc2FmZSBzZXF1ZW5jZSBleGlzdHMuXG4iOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgIlN5c3RlbSBpcyBpbiBhIHNhZmUgc3RhdGUuXG5TYWZlIHNlcXVlbmNlIGlzOiAiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQOyBpKyspCiAgICAgICAgY291dCA8PCAiUCIgPDwgc2FmZVNlcVtpXSA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewogICAgaW50IHByb2Nlc3Nlc1tdID0gezAsIDEsIDIsIDMsIDR9OwoKICAgIGludCBhdmFpbGFibGVbUl0gPSB7MywgMywgMn07CgogICAgaW50IG1heFtQXVtSXSA9IHsKICAgICAgICB7NywgNSwgM30sCiAgICAgICAgezMsIDIsIDJ9LAogICAgICAgIHs5LCAwLCAyfSwKICAgICAgICB7MiwgMiwgMn0sCiAgICAgICAgezQsIDMsIDN9CiAgICB9OwoKICAgIGludCBhbGxvdFtQXVtSXSA9IHsKICAgICAgICB7MCwgMSwgMH0sCiAgICAgICAgezIsIDAsIDB9LAogICAgICAgIHszLCAwLCAyfSwKICAgICAgICB7MiwgMSwgMX0sCiAgICAgICAgezAsIDAsIDJ9CiAgICB9OwoKICAgIGZpbmRTYWZlU2VxdWVuY2UocHJvY2Vzc2VzLCBhdmFpbGFibGUsIG1heCwgYWxsb3QpOwogICAgcmV0dXJuIDA7Cn0K