九敏!!!Python课设救我!实在不会了!

题目:金融风暴
银行间会相互借贷。在经济艰难时期,如果一家银行宣告破产,它可能无法偿还贷款。一家银行的资产总额是它现有的余额加上它给其他银行的贷款。下图显示了5家银行之间的借贷关系和自身资产余额。各银行的现有余额分别是25、125、175、75和181百万美元。节点1到节点2的有向边表明银行1将40百万美元借给银行2。

(a)银行间的借贷关系

img

如果一家银行的资产总额低于一定的界限,这家银行就身处险境了。此时该银行将无法给其他银行偿还它的贷款,因此贷方银行无法将这些贷款计入它的资产总额。因此,该贷方银行的资产总额同样可能低于这个界限,它也就可能变得危险。编写一个程序找出所有不安全的银行。程序应读入如下所示的输入值。它首先读入两个整数n和limit,其中n表明银行的数量,limit是维持银行安全的最低资产总额。接着读入n行信息,它们以0到n-1标识这n家银行。行中的第一个数是银行的余额,第二个数指明从银行贷款的银行数量,其余数字都是由两个数组成的数对。每对数描述一个借方。每对数的第一个数是借方银行的标识,第二个数是所借的金额。例如,上图中五家银行的输入值如下所示(注意界限是201)。
5 201
25 2 1 100.5 4 320.5
125 2 2 40 3 85
175 2 0 125 3 75
75 1 0 125
181 1 2 125
银行3 的资产总额是(75+125),低于201,因此银行3是不安全的。在银行3不再安全之后,银行1的资产总额下降到低于界限(125+40),因此银行1也变成不安全的。程序的输出应该是:
Unsafe banks are 3 1

(提示:使用二维列表borrowers来表示贷款,borrowers[i][j]表示银行i贷款给银行j的总额。一旦银行j不再安全,borrowers[i][j]应当置为0。

程序实现

数据结构——图类

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 23 08:59:21 2019

@author: 23820
"""
class Graph:    #图类
    '''
    构造具有vertex个顶点的图
    输入:顶点个数
    '''
    def __init__(self, vertex):
        self.vertex = vertex#为点集赋值
        self.graph = [[0] * vertex for i in range(vertex)]#使用列表生成器生成邻接矩阵
    '''
    加边,这里u,v是顶点序号
    输入:u、v顶点的序号
    '''
    def add_edge(self, u, v, weight=1):#
        self.graph[u][v] = weight#对u、v进行-1使之与存储位置对应上

    '''
    展示函数,用于显示点之间的联系
    输出:图类的边集显示
    '''
    def show(self): #

        for i in self.graph:
            for j in i:
                print(j, end=" ")
            print(" ")

'''
g = Graph(5)

g.add_edge(0, 1, 100.5)
g.add_edge(0, 4, 320.5)
g.add_edge(1, 2, 40)
g.add_edge(1, 3, 85)
g.add_edge(2, 0, 125)
g.add_edge(2, 3, 75)
g.add_edge(3, 0, 125)
g.add_edge(4, 2, 125)

g.show()
'''

银行类——用于解决问题

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 23 09:27:46 2019

@author: 23820
"""
from graph import Graph

class Banks(Graph):    #银行类
    
    '''
    初始化方法,将对应个数的银行加入到抽象图中
    输入:bankNumber:银行个数
    '''
    def __init__(self, bankNumber, safe=201):
        super().__init__(bankNumber)
        self.__safe = 201#安全金额
        self.__unsafe = []#不安全的银行
        self.__safeMatrix = []#安全矩阵,不对用户开放
        self.__borrowers=self.graph#贷款数组
        self.__bank=self.vertex#银行个数
    
    #获得类的私有属性
    @property
    def borrowers(self):
        return self.__borrowers
    
    @property
    def unsafe(self):
        return self.__unsafe
    
    @property
    def safe(self):
        return self.__safe
    
    @property
    def bank(self):
        return self.__bank
    
        
    '''
    a银行借贷给b银行,抽象为有向图中的加边过程
    输入:a:a银行的编号,b:b银行的编号,Amount:贷款金额
    '''
    def loans(self, a, b, Amount):
        super().add_edge(a, b, Amount)
    
    '''
    二维列表深拷贝,将borrowers数组完全拷贝到safeMatrix中
    '''
    def update(self):
        self.__safeMatrix = \
        [[self.__borrowers[i][j] for j in range(len(self.__borrowers[0]))] \
          for i in range(len(self.__borrowers))]
           
    '''
    检查是否安全,使用递归算法(类似快速排序)
    输入:a:检测的银行,safe:安全的金额数
    输出:无返回值,更新了unsafe和safeMatrix
    '''
    def isSafe(self, begin, end):
        for i in range(begin, end):
            s = 0#金额
            for j in self.__safeMatrix[i]:#每行求和
                s += j
            if(s < self.__safe):#如果小于最小额度
                self.__unsafe.append(i)#将i银行加入不安全列表中
                #更新矩阵,所有借给这家银行的钱都无法要回
                for k in range(self.__bank):
                    self.__safeMatrix[k][i] = 0
                self.isSafe(begin, i)#对于前面的银行重新计算
                self.isSafe(i+1, end)#对于后面的银行重新计算
            else:
               #print('yes')
               pass

#获取用户输入的数据
def getData():
    first = input().split()
    banknumber = int(first[0])#有banknumber家银行
    g = Banks(banknumber, int(first[1]))
    for i in range(banknumber):#输入银行的数据
        row = input().split()
        g.loans(i, i, float(row[0]))#每家银行借给自己的钱
        count = int(row[1]) #共有几次贷款
        if count > 0:#有贷款
            index = 2#索引位置
            for j in range(count):
                g.loans(i, int(row[index]), float(row[index+1]))
                index += 2
        else:#没有贷款
            pass
    return g
    #print(g.bank)

gra = getData()
gra.update()
gra.isSafe(0, 5)
print(gra.unsafe)

'''
#测试用例
g = Banks(5)
g.loans(0, 0, 25)
g.loans(0, 1, 100.5)
g.loans(0, 4, 320.5)
g.loans(1, 1, 125)
g.loans(1, 2, 40)
g.loans(1, 3, 85)
g.loans(2, 2, 175)
g.loans(2, 0, 125)
g.loans(2, 3, 75)
g.loans(3, 3, 75)
g.loans(3, 0, 125)
g.loans(4, 4, 181)
g.loans(4, 2, 125)

#g.show()

#print(g.safeMatrix)
g.update()
g.isSafe(0, 5)
print(g.borrowers)
#print(g.safeMatrix)
print(g.unsafe)
#print(g.unsafe)
'''