1125. 牛的旅行

摘要
Title: 1125. 牛的旅行
Tag: floyd
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1125. 牛的旅行

  • 题意

    题目的问题:给定两个联通块,在两个连通块中各取任意一点进行连接合成一个连通块,求合并后的联通块的最长路径的最小值

  • 思路

    mximx_i 表示从i出发能到达的最长距离,设要连的边是(i, j)

    • 当 i,j 在同一连通块,答案就是mxi\sum mx_i
    • 当 i,j 在同一连通块,答案就是mxi+disi,j+mxjmx_i + dis_{i,j} + mx_j

    用floyd算出任意两点的最短距离即可

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    '''
    Author: NEFU AB-IN
    Date: 2023-03-19 15:48:41
    FilePath: \Acwing\1125\1125.py
    LastEditTime: 2023-03-19 16:27:41
    '''
    read = lambda: map(int, input().split())
    from collections import Counter, deque
    from heapq import heappop, heappush
    from itertools import permutations
    from math import sqrt

    N = int(160)
    INF = int(2e9)
    pos = [[] for _ in range(N)]
    g = [0]
    dist = [[INF] * N for _ in range(N)]
    mx = [0] * N


    def cale(i, j):
    x1, y1 = pos[i]
    x2, y2 = pos[j]
    return sqrt(abs(x1 - x2)**2 + abs(y1 - y2)**2)


    def floyd():
    for k in range(1, n + 1):
    for i in range(1, n + 1):
    for j in range(1, n + 1):
    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])


    n = int(input())
    for i in range(1, n + 1):
    x, y = read()
    pos[i] = [x, y]

    for i in range(n):
    g.append('0' + input())

    for i in range(1, n + 1):
    for j in range(1, n + 1):
    if i == j:
    dist[i][j] = 0
    if g[i][j] == '1':
    dist[i][j] = dist[j][i] = cale(i, j)

    floyd()

    ans1, ans2 = 0, INF
    for i in range(1, n + 1):
    for j in range(1, n + 1):
    if dist[i][j] != INF:
    mx[i] = max(mx[i], dist[i][j])
    ans1 = max(ans1, mx[i])

    for i in range(1, n + 1):
    for j in range(1, n + 1):
    if dist[i][j] == INF:
    ans2 = min(ans2, mx[i] + cale(i, j) + mx[j])

    print(f"{max(ans1, ans2):.6f}")

使用搜索:谷歌必应百度