银行家算法C++代码实现

闲言少叙,直接上代码 

#include <bits/stdc++.h>
using namespace std;
const int maxn=1001;
int Max[maxn][maxn],Allocation[maxn][maxn],Need[maxn][maxn];
int Available[maxn],Work[maxn],Request[maxn],process;
bool Finish[maxn];
int n,m;
vector<int> safeList;
void init(){//初始化函数
    printf("输入进程数n与资源种数m:");
    scanf("%d%d",&n,&m);//(1)初始化进程数与资源种数
    printf("输入最大需求矩阵Max[n][m]:");
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&Max[i][j]);//(2)初始化最大需求矩阵
        }

    }
    printf("输入分配矩阵Allocation[n][m]:");
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&Allocation[i][j]);//(3)初始化分配矩阵
            Need[i][j]=Max[i][j]-Allocation[i][j];//(4)初始化Need矩阵
        }
    }
    printf("输入可用资源数组Available[m]:");
    for(int i=0;i<m;i++){
        scanf("%d",&Available[i]);//(5)初始化可用资源数组
    }
    printf("输入申请资源的进程process:");
    scanf("%d",&process);//(7)初始化申请资源的进程
    printf("输入申请资源数组Request[m]:");
    for(int i=0;i<m;i++){
        scanf("%d",&Request[i]);//(8)初始化申请资源数组
    }
}
bool isSmaller(int pro){//比较向量大小
    for(int i=0;i<m;i++){
        if(Work[i]<Need[pro][i])
            return false;
    }
    return true;
}
bool isSafe(){//安全性算法(核心算法)
    memcpy(Work,Available,sizeof(Available));
    memset(Finish,false,sizeof(Finish));
    while(1){
        bool flag=false;
        for(int i=0;i<n;i++){
            if(Finish[i]==false&&isSmaller(i)){
                flag=true;
                for(int j=0;j<m;j++){
                    Work[j]+=Allocation[i][j];
                }
                Finish[i]=true;
                safeList.push_back(i);
                break;
            }
        }
        if(flag==false){
            for(int i=0;i<m;i++){
                if(Finish[i]==false){
                    printf("不安全状态\n");
                    return false;
                }
            }
            printf("安全状态\n");
            printf("其中一个安全序列为:");
            for(auto i:safeList)
                printf("%d ",i);
            return true;
        }
    }
}
bool banker(){//银行家算法
    for(int j=0;j<m;j++){//(1)如果Request[j]<=Need[process][j]便转向(2),否则认为出错
        if(Request[j]>Need[process][j])
            return false;
    }
    for(int j=0;j<m;j++){//(2)如果Request[j]<=Available[process][j]便转向(3),否则表示尚无足够资源,进程process必须等待
        if(Request[j]>Available[j])
            return false;
    }
    //(3)系统试探着把资源分配给进程process,并修改相应的数据
    int copy_available[maxn];
    int copy_allocation[maxn],copy_need[maxn];
    for(int j=0;j<m;j++){
        copy_available[j]=Available[j];//备份可用资源数组
        copy_allocation[j]=Allocation[process][j];//备份process进程的已分配资源数组
        copy_need[j]=Need[process][j];//备份process进程的need数组
        Available[j]-=Request[j];//更新可用资源数组
        Allocation[process][j]+=Request[j];
        Need[process][j]-=Request[j];
    }
    if(isSafe()) return true;
    else{
        for(int j=0;j<m;j++){
            Available[j]=copy_available[j];//恢复可用资源数组
            Allocation[process][j]=copy_allocation[j];//恢复process进程的已分配资源数组
            Need[process][j]=copy_need[j];//恢复process进程的need数组
        }
        return false;
    }
}
int main()
{
    init();
    if(banker());
    else printf("不可以实施资源分配");
    return 0;
}

给个例子​​​​​​​

输入: 

5 3
5 5 9 5 3 6 4 0 11 4 0 5 5 4 2
2 1 2 4 0 2 4 0 5 2 0 4 3 1 4
2 3 3
3
2 0 1 

代码运行示例:

 ​​​​​​​

注:安全序列不唯一

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值