简单图论:聪明的猴子

解题思路

最小生成树

问题实质:构建一个连通图,使得该连通图的最长边最短。
发现:根据Kruskal算法的步骤流程,构建的Kruskal是由最短边逐次添加,即
该连通图的最长边最短。
**改动:**根据任务需求,在构建最小生成树时,每添加一组连边,则比较一下点与点之间距离,保留最大值。
根据每只猴子的最大跳远距离和最小生成树中的距离最大值的比较,计算结果。

AC_Code

# -*- coding: utf-8 -*-
# @Author : BYW-yuwei
# @Software: python3.8.6
from math import sqrt
ax = [0 for _ in range(10005)]
ay = [0 for _ in range(10005)]
e = []
f = [i for i in range(10005)]
vis = [0 for _ in range(10005)]
def js(x,y):
    return (ax[x]-ax[y])*(ax[x]-ax[y])+(ay[x]-ay[y])*(ay[x]-ay[y])
def getf(x):
    if x == f[x]:
        return x
    f[x] = getf(f[x])
    return f[x]
ecnt = 0
def add(u,v,w):
    global ecnt
    ecnt+=1
    e.append((u,v,w))
m = int(input())
hz = list(map(int,input().split()))
n = int(input())
for i in range(n):
    ax[i],ay[i] = map(int,input().split())
for i in range(n):
    for j in range(i+1,n):
        add(i+1,j+1,js(i,j))

cnt = 0
ans = -1
e = sorted(e,key = lambda x:x[2])

for i in range(ecnt):
    u,v = getf(e[i][0]),getf(e[i][1])
    if u!=v:
        cnt+=1
        ans = max(ans,sqrt(e[i][2]))
        f[u] = v
        if cnt==n-1:
            break
res = 0
for i in range(m):
    if ans<=hz[i]:
        res+=1
print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨拾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值