#include <iostream>
#include <vector>
using namespace std;
#define N 1000
#define M 1000
int Available[M];
int Max[N][M];
int Allocation[N][M];
int Need[N][M];
int Work[N];
bool Finish[N];
vector<int>ans;
int n, m;
bool Can(int id, int Need[][M], int Work[])
{
for (int i = 0; i < m; i++)
{
if (Need[id][i] > Work[i])
{
return false;
}
}
return true;
}
bool check1(int n, int m, int Work[], int Need[][M], int Allocation[][M], bool *Finsh)
{
for (int i = 0; i < n; i++)
{
Finish[i] = false;
}
for (int i = 0; i < m; i++)
{
Work[i] = Available[i];
}
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
if (!Finish[i])
{
if (Can(i, Need, Work))
{
ans.push_back(i);
for (int j = 0; j < m; j++)
{
if (Need[i][j] <= Work[j])
{
Work[j] += Allocation[i][j];
}
}
Finish[i] = true;
}
}
}
}
for (int i = 0; i < n; i++)
{
if (!Finish[i]) return false;
}
return true;
}
int main()
{
cout << "输入进程数n和资源数m:" << endl;
cin >> n;
cin >> m;
cout << "输入可用资源的数量(Available):" << endl;
for (int i = 0; i < m; i++)
{
cin >> Available[i];
}
cout << "输入分给每个进程的资源数(Allocation):" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> Allocation[i][j];
}
}
cout << "输入每个进程对资源的最大需求(Max):" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> Max[i][j];
}
}
cout << "输入进程缺少多少资源(Need):" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> Need[i][j];
}
}
if (check1(n, m, Work, Need, Allocation, Finish))
{
cout << "当前是安全状态" << endl;
cout << "进程\tAllocation\tMax\t\tNeed\t\tAvailable\n";
for (int i = 0; i < n; i++)
{
cout << char(i + 'A') << "\t";
for (int j = 0; j < m; j++)
{
cout << Allocation[i][j] << " ";
}
cout << "\t\t";
for (int j = 0; j < m; j++)
{
cout << Max[i][j] << " ";
}
cout << "\t\t";
for (int j = 0; j < m; j++)
{
cout << Need[i][j] << " ";
}
if(i < n-1)
cout << endl;
}
cout << "\t\t";
for (int i = 0; i < m; i++)
{
cout << Available[i] << " ";
}
cout << endl;
cout << "安全序列:\n";
for (int i = 0; i < n; i++)
{
cout << char(ans[i]+'A') << " ";
}
cout << endl;
}
else
{
cout << "当前不是安全状态" << endl;
}
return 0;
}
/*
4 3
1 1 2
1 1 0
5 1 1
2 1 1
0 0 2
3 2 2
6 1 3
3 1 4
4 2 2
2 2 2
1 0 2
1 0 3
4 2 0
*/