家庭房产并查集python

def find(x):
    if bcj.get(x) == None:
        bcj[x] = x
    if bcj[x] == x:
        return x
    return find(bcj[x])


def union(x, y):
    x = find(x)
    y = find(y)
    if x != y:
        if x > y:
            bcj[x] = y
        else:
            bcj[y] = x


n = int(input())
bcj = {}
member = {}
housecount = {}
areasize = {}
for i in range(n):
    a = input().split(" ")
    people = []
    me = a[0]
    father = a[1]
    mother = a[2]
    children = a[4:-2]
    house = a[-2]
    area = a[-1]
    people.append(me)
    people.append(mother)
    people.append(father)
    people.extend(children)
    people = set(people)
    people.discard("-1")
    housecount[me] = house
    areasize[me] = area
    for i in people:
        union(i, me)
for i in bcj:
    root = find(i)
    if member.get(root) == None:
        member[root] = 1
    else:
        member[root] += 1
houses = {}
for i in housecount:
    root = find(i)
    housecount[i] = int(housecount[i])
    if houses.get(root) == None:
        houses[root] = housecount[i]
    else:
        houses[root] += housecount[i]
for i in houses:
    houses[i] = houses[i] / member[i]
areasizes = {}
for i in areasize:
    root = find(i)
    areasize[i] = int(areasize[i])
    if areasizes.get(root) == None:
        areasizes[root] = areasize[i]
    else:
        areasizes[root] += areasize[i]
for i in areasizes:
    areasizes[i] = areasizes[i] / member[i]
outcome = []
for i in member.keys():
    p = []
    p.append(i)
    p.append(member[i])
    p.append(houses[i])
    p.append(areasizes[i])
    outcome.append(p)
long = len(member)
for i in range(long - 1):
    for j in range(long - i - 1):
        if outcome[j][3] < outcome[j + 1][3] or outcome[j][3] == outcome[j + 1][3] and outcome[j][0] > outcome[j + 1][0]:
            temp = outcome[j]
            outcome[j] = outcome[j + 1]
            outcome[j + 1] = temp
print(len(member))
for i in outcome:
    a = i
    print(a[0], end=" ")
    print(a[1], end=" ")
    print("%.3f" % a[2], end=" ")
    print("%.3f" % a[3])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值