#include <iostream>
#include <vector>
using namespace std;
class BankersAlgorithm {
private:
int P, R;
vector<vector<int>> max, allot, need;
vector<int> available, work, safeSeq;
vector<bool> finish;
public:
// Constructor to initialize the Banker's algorithm variables
BankersAlgorithm(int processes, int resources) {
P = processes; // Number of processes
R = resources; // Number of resources
max.resize(P, vector<int>(R));
allot.resize(P, vector<int>(R));
need.resize(P, vector<int>(R));
finish.resize(P, false);
available.resize(R);
work.resize(R);
}
// Function to set maximum resource requirements for each process
void setMax(int i, vector<int> maxResources) {
max[i] = maxResources;
}
// Function to set allocated resources for each process
void setAllot(int i, vector<int> allottedResources) {
allot[i] = allottedResources;
}
// Function to set available resources
void setAvailable(vector<int> availableResources) {
available = availableResources;
}
// Function to calculate the Need matrix
void calculateNeed() {
for (int i = 0; i < P; i++) {
for (int j = 0; j < R; j++) {
need[i][j] = max[i][j] - allot[i][j];
}
}
}
// Function to check if the system is in a safe state
bool isSafe() {
work = available;
safeSeq.clear();
fill(finish.begin(), finish.end(), false);
int count = 0;
while (count < P) {
bool found = false;
for (int i = 0; i < P; i++) {
if (!finish[i]) {
bool canFinish = true;
// Check if the process can finish with current available resources
for (int j = 0; j < R; j++) {
if (need[i][j] > work[j]) {
canFinish = false;
break;
}
}
// If the process can finish, update the work and finish status
if (canFinish) {
for (int k = 0; k < R; k++) {
work[k] += allot[i][k]; // Add allocated resources to work
}
finish[i] = true;
safeSeq.push_back(i);
count++;
found = true;
}
}
}
if (!found) {
return false; // If no process can finish, the system is unsafe
}
}
return true; // If all processes can finish, the system is safe
}
// Function to print the safe sequence
void printSafeSequence() {
if (isSafe()) {
cout << "System is in a safe state.\nSafe sequence is: ";
for (int i = 0; i < P; i++) {
cout << "P" << safeSeq[i] << " ";
}
cout << endl;
} else {
cout << "System is in an unsafe state.\n";
}
}
};
int main() {
int P = 5; // Number of processes
int R = 3; // Number of resources
BankersAlgorithm bank(P, R);
// Set maximum resource requirements for each process
bank.setMax(0, {7, 5, 3});
bank.setMax(1, {3, 2, 2});
bank.setMax(2, {9, 0, 2});
bank.setMax(3, {2, 2, 2});
bank.setMax(4, {4, 3, 3});
// Set allocated resources for each process
bank.setAllot(0, {0, 1, 0});
bank.setAllot(1, {2, 0, 0});
bank.setAllot(2, {3, 0, 2});
bank.setAllot(3, {2, 1, 1});
bank.setAllot(4, {0, 0, 2});
// Set available resources
bank.setAvailable({3, 3, 2});
// Calculate Need matrix and print safe sequence
bank.calculateNeed();
bank.printSafeSequence();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFua2Vyc0FsZ29yaXRobSB7CnByaXZhdGU6CiAgICBpbnQgUCwgUjsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gbWF4LCBhbGxvdCwgbmVlZDsKICAgIHZlY3RvcjxpbnQ+IGF2YWlsYWJsZSwgd29yaywgc2FmZVNlcTsKICAgIHZlY3Rvcjxib29sPiBmaW5pc2g7CgpwdWJsaWM6CiAgICAvLyBDb25zdHJ1Y3RvciB0byBpbml0aWFsaXplIHRoZSBCYW5rZXIncyBhbGdvcml0aG0gdmFyaWFibGVzCiAgICBCYW5rZXJzQWxnb3JpdGhtKGludCBwcm9jZXNzZXMsIGludCByZXNvdXJjZXMpIHsKICAgICAgICBQID0gcHJvY2Vzc2VzOyAgLy8gTnVtYmVyIG9mIHByb2Nlc3NlcwogICAgICAgIFIgPSByZXNvdXJjZXM7ICAvLyBOdW1iZXIgb2YgcmVzb3VyY2VzCiAgICAgICAgbWF4LnJlc2l6ZShQLCB2ZWN0b3I8aW50PihSKSk7CiAgICAgICAgYWxsb3QucmVzaXplKFAsIHZlY3RvcjxpbnQ+KFIpKTsKICAgICAgICBuZWVkLnJlc2l6ZShQLCB2ZWN0b3I8aW50PihSKSk7CiAgICAgICAgZmluaXNoLnJlc2l6ZShQLCBmYWxzZSk7CiAgICAgICAgYXZhaWxhYmxlLnJlc2l6ZShSKTsKICAgICAgICB3b3JrLnJlc2l6ZShSKTsKICAgIH0KCiAgICAvLyBGdW5jdGlvbiB0byBzZXQgbWF4aW11bSByZXNvdXJjZSByZXF1aXJlbWVudHMgZm9yIGVhY2ggcHJvY2VzcwogICAgdm9pZCBzZXRNYXgoaW50IGksIHZlY3RvcjxpbnQ+IG1heFJlc291cmNlcykgewogICAgICAgIG1heFtpXSA9IG1heFJlc291cmNlczsKICAgIH0KCiAgICAvLyBGdW5jdGlvbiB0byBzZXQgYWxsb2NhdGVkIHJlc291cmNlcyBmb3IgZWFjaCBwcm9jZXNzCiAgICB2b2lkIHNldEFsbG90KGludCBpLCB2ZWN0b3I8aW50PiBhbGxvdHRlZFJlc291cmNlcykgewogICAgICAgIGFsbG90W2ldID0gYWxsb3R0ZWRSZXNvdXJjZXM7CiAgICB9CgogICAgLy8gRnVuY3Rpb24gdG8gc2V0IGF2YWlsYWJsZSByZXNvdXJjZXMKICAgIHZvaWQgc2V0QXZhaWxhYmxlKHZlY3RvcjxpbnQ+IGF2YWlsYWJsZVJlc291cmNlcykgewogICAgICAgIGF2YWlsYWJsZSA9IGF2YWlsYWJsZVJlc291cmNlczsKICAgIH0KCiAgICAvLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIE5lZWQgbWF0cml4CiAgICB2b2lkIGNhbGN1bGF0ZU5lZWQoKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBSOyBqKyspIHsKICAgICAgICAgICAgICAgIG5lZWRbaV1bal0gPSBtYXhbaV1bal0gLSBhbGxvdFtpXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgc3lzdGVtIGlzIGluIGEgc2FmZSBzdGF0ZQogICAgYm9vbCBpc1NhZmUoKSB7CiAgICAgICAgd29yayA9IGF2YWlsYWJsZTsKICAgICAgICBzYWZlU2VxLmNsZWFyKCk7CiAgICAgICAgZmlsbChmaW5pc2guYmVnaW4oKSwgZmluaXNoLmVuZCgpLCBmYWxzZSk7CgogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgd2hpbGUgKGNvdW50IDwgUCkgewogICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaFtpXSkgewogICAgICAgICAgICAgICAgICAgIGJvb2wgY2FuRmluaXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBjYW4gZmluaXNoIHdpdGggY3VycmVudCBhdmFpbGFibGUgcmVzb3VyY2VzCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBSOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRbaV1bal0gPiB3b3JrW2pdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5GaW5pc2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcm9jZXNzIGNhbiBmaW5pc2gsIHVwZGF0ZSB0aGUgd29yayBhbmQgZmluaXNoIHN0YXR1cwogICAgICAgICAgICAgICAgICAgIGlmIChjYW5GaW5pc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBSOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtba10gKz0gYWxsb3RbaV1ba107ICAvLyBBZGQgYWxsb2NhdGVkIHJlc291cmNlcyB0byB3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoW2ldID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVNlcS5wdXNoX2JhY2soaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gSWYgbm8gcHJvY2VzcyBjYW4gZmluaXNoLCB0aGUgc3lzdGVtIGlzIHVuc2FmZQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOyAgLy8gSWYgYWxsIHByb2Nlc3NlcyBjYW4gZmluaXNoLCB0aGUgc3lzdGVtIGlzIHNhZmUKICAgIH0KCiAgICAvLyBGdW5jdGlvbiB0byBwcmludCB0aGUgc2FmZSBzZXF1ZW5jZQogICAgdm9pZCBwcmludFNhZmVTZXF1ZW5jZSgpIHsKICAgICAgICBpZiAoaXNTYWZlKCkpIHsKICAgICAgICAgICAgY291dCA8PCAiU3lzdGVtIGlzIGluIGEgc2FmZSBzdGF0ZS5cblNhZmUgc2VxdWVuY2UgaXM6ICI7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICJQIiA8PCBzYWZlU2VxW2ldIDw8ICIgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCAiU3lzdGVtIGlzIGluIGFuIHVuc2FmZSBzdGF0ZS5cbiI7CiAgICAgICAgfQogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBpbnQgUCA9IDU7ICAvLyBOdW1iZXIgb2YgcHJvY2Vzc2VzCiAgICBpbnQgUiA9IDM7ICAvLyBOdW1iZXIgb2YgcmVzb3VyY2VzCgogICAgQmFua2Vyc0FsZ29yaXRobSBiYW5rKFAsIFIpOwoKICAgIC8vIFNldCBtYXhpbXVtIHJlc291cmNlIHJlcXVpcmVtZW50cyBmb3IgZWFjaCBwcm9jZXNzCiAgICBiYW5rLnNldE1heCgwLCB7NywgNSwgM30pOwogICAgYmFuay5zZXRNYXgoMSwgezMsIDIsIDJ9KTsKICAgIGJhbmsuc2V0TWF4KDIsIHs5LCAwLCAyfSk7CiAgICBiYW5rLnNldE1heCgzLCB7MiwgMiwgMn0pOwogICAgYmFuay5zZXRNYXgoNCwgezQsIDMsIDN9KTsKCiAgICAvLyBTZXQgYWxsb2NhdGVkIHJlc291cmNlcyBmb3IgZWFjaCBwcm9jZXNzCiAgICBiYW5rLnNldEFsbG90KDAsIHswLCAxLCAwfSk7CiAgICBiYW5rLnNldEFsbG90KDEsIHsyLCAwLCAwfSk7CiAgICBiYW5rLnNldEFsbG90KDIsIHszLCAwLCAyfSk7CiAgICBiYW5rLnNldEFsbG90KDMsIHsyLCAxLCAxfSk7CiAgICBiYW5rLnNldEFsbG90KDQsIHswLCAwLCAyfSk7CgogICAgLy8gU2V0IGF2YWlsYWJsZSByZXNvdXJjZXMKICAgIGJhbmsuc2V0QXZhaWxhYmxlKHszLCAzLCAyfSk7CgogICAgLy8gQ2FsY3VsYXRlIE5lZWQgbWF0cml4IGFuZCBwcmludCBzYWZlIHNlcXVlbmNlCiAgICBiYW5rLmNhbGN1bGF0ZU5lZWQoKTsKICAgIGJhbmsucHJpbnRTYWZlU2VxdWVuY2UoKTsKCiAgICByZXR1cm4gMDsKfQo=