#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
n = 5; // Number of processes
m = 3; // Number of resources
vector<vector<int>> Max
{
{ 6, 5, 3 },
{ 4, 2, 1 },
{ 5, 1, 2 },
{ 1, 0, 2 },
{ 5, 2, 3 }
};
vector < vector<int>> Alloc
{
{ 1, 0, 2 },
{ 3, 1, 0 },
{ 0, 1, 1 },
{ 1, 0, 1 },
{ 1, 0, 2 }
};
vector<int> Total { 7, 5, 7 }; // Total initial available resources
vector<int>Avail(m); // Available resources after allocation
for (int j = 0; j < m; j++)
{
int s = 0;
for (int i = 0; i < n; i++)
{
s += Alloc[i][j];
}
Avail[j] = Total[j] - s;
}
vector<int>Exec(n, 0);
vector<vector<int>> Need( n , vector<int> (m));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
Need[i][j] = Max[i][j] - Alloc[i][j];
}
int k, c = 0;
vector<int>seq;
while (c < n)
{
for (int i = 0; i < n; i++)
{
if (Exec[i] == 0)
{
int mark = 0;
for (int j = 0; j < m; j++)
{
if (Need[i][j] > Avail[j])
{
mark = 1;
break;
}
}
if (mark == 0)
{
seq.push_back(i + 1);
for (k = 0; k < m; k++)
{
Avail[k] += Alloc[i][k];
}
Exec[i] = 1;
}
}
}
c++;
}
cout << "The safe sequence of execution is ";
for (int i = 0; i < n ; i++)
{
if (i == n - 1)
cout << " P" << seq[i] << "\n";
else
cout << " P" << seq[i] << " ->";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBtYWluKCkKewoJaW50IG4sIG07CgluID0gNTsgLy8gTnVtYmVyIG9mIHByb2Nlc3NlcwoJbSA9IDM7IC8vIE51bWJlciBvZiByZXNvdXJjZXMKCgl2ZWN0b3I8dmVjdG9yPGludD4+IE1heAoJewoJCXsgNiwgNSwgMyB9LAoJCXsgNCwgMiwgMSB9LAoJCXsgNSwgMSwgMiB9LAoJCXsgMSwgMCwgMiB9LAoJCXsgNSwgMiwgMyB9Cgl9OwoJdmVjdG9yIDwgdmVjdG9yPGludD4+IEFsbG9jCgl7CgkJeyAxLCAwLCAyIH0sCgkJeyAzLCAxLCAwIH0sCgkJeyAwLCAxLCAxIH0sCgkJeyAxLCAwLCAxIH0sCgkJeyAxLCAwLCAyIH0KCX07Cgl2ZWN0b3I8aW50PiBUb3RhbCB7IDcsIDUsIDcgfTsgLy8gVG90YWwgaW5pdGlhbCBhdmFpbGFibGUgcmVzb3VyY2VzCgl2ZWN0b3I8aW50PkF2YWlsKG0pOyAvLyBBdmFpbGFibGUgcmVzb3VyY2VzIGFmdGVyIGFsbG9jYXRpb24KCWZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQoJewoJCWludCBzID0gMDsKCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQl7CgkJCXMgKz0gQWxsb2NbaV1bal07CgkJfQoJCUF2YWlsW2pdID0gVG90YWxbal0gLSBzOwoJfQoKCXZlY3RvcjxpbnQ+RXhlYyhuLCAwKTsKCXZlY3Rvcjx2ZWN0b3I8aW50Pj4gTmVlZCggbiAsIHZlY3RvcjxpbnQ+IChtKSk7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCXsKCQlmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKCQkJTmVlZFtpXVtqXSA9IE1heFtpXVtqXSAtIEFsbG9jW2ldW2pdOwoJfQoJaW50IGssIGMgPSAwOwoJdmVjdG9yPGludD5zZXE7Cgl3aGlsZSAoYyA8IG4pCgl7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJewoJCQlpZiAoRXhlY1tpXSA9PSAwKQoJCQl7CgkJCQlpbnQgbWFyayA9IDA7CgkJCQlmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKCQkJCXsKCQkJCQlpZiAoTmVlZFtpXVtqXSA+IEF2YWlsW2pdKQoJCQkJCXsKCQkJCQkJbWFyayA9IDE7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChtYXJrID09IDApCgkJCQl7CgkJCQkJc2VxLnB1c2hfYmFjayhpICsgMSk7CgkJCQkJZm9yIChrID0gMDsgayA8IG07IGsrKykKCQkJCQl7CgkJCQkJCUF2YWlsW2tdICs9IEFsbG9jW2ldW2tdOwoJCQkJCX0KCQkJCQlFeGVjW2ldID0gMTsKCQkJCX0KCQkJfQoJCX0KCQljKys7Cgl9Cgljb3V0IDw8ICJUaGUgc2FmZSBzZXF1ZW5jZSBvZiBleGVjdXRpb24gaXMgIjsKCWZvciAoaW50IGkgPSAwOyBpIDwgbiA7IGkrKykKCXsKCQlpZiAoaSA9PSBuIC0gMSkKCQkJY291dCA8PCAiIFAiIDw8IHNlcVtpXSA8PCAiXG4iOwoJCWVsc2UKCQkJY291dCA8PCAiIFAiIDw8IHNlcVtpXSA8PCAiIC0+IjsKCX0KfQ==