首页 > 其他分享 >P1522 [USACO2.4] 牛的旅行 Cow Tours

P1522 [USACO2.4] 牛的旅行 Cow Tours

时间:2023-10-01 20:45:39浏览次数:43  
标签:ma1 Cow pf int ll t2 t1 Tours USACO2.4

Problem

题目简述

给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值

思路

本题主要做法:\(Floyd\)。

  • 首先,Floyd求出任意两个点之间的最短路。
  • 枚举每一个点,求出以这个点能走到的所有点中距离的最大值。(一定在能走到的情况下,不然默认距离就是0x3f, 会导致结果错误 )
  • 设 \(ma1\) 为最大的直径(每个 \(ma[i]\) 的最大值)。
  • 再设 \(mi1\) 为任意两点加边的新直径的最小值
  • 答案为:\(max(ma1, mi1)\) 。

代码

#include <iostream>

#define ll long long

using namespace std;


const int N = 160, INF = 0x3f3f3f3f;
double d[N][N], ma1, mi1, ma[N];
ll p[N][3];

ll pf(int x) { return 1LL * x * x; }

double get(int t1, int t2) {
    return sqrt(pf(p[t1][1] - p[t2][1]) + pf(p[t1][2] - p[t2][2]));
}

int n;
char c;

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i][1] >> p[i][2];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> c;
            if (i == j) d[i][j] = 0;
            else if (c == '1') d[i][j] = get(i, j);
            else d[i][j] = INF;
        }
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (d[i][j] != INF) ma[i] = max(ma[i], d[i][j]);
        }
        ma1 = max(ma1, ma[i]);
    }
    mi1 = INF;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (d[i][j] == INF) mi1 = min(mi1, ma[i] + ma[j] + get(i, j));
        }
    }
    printf("%.6lf", max(ma1, mi1));
    return 0;
}

标签:ma1,Cow,pf,int,ll,t2,t1,Tours,USACO2.4
From: https://www.cnblogs.com/yhx0322/p/17739244.html

相关文章

  • P6066 [USACO05JAN] Watchcow S
    prologue这个题这么水的一个板子题。analysis这个题目我们正反建两条边,在跑欧拉回路的时候,看这个边是不是被走过,走过就不走,跳过这个边。如果没走,就走这条边并且标记这个边走过了。codetime#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definerlr......
  • 洛谷P3612 [USACO17JAN] Secret Cow Code S
    [USACO17JAN]SecretCowCodeS题面翻译奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当......
  • 【POJ 3278】Catch That Cow 题解(广度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • 【POJ 3278】Catch That Cow 题解(深度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • P6961 [NEERC2017] Journey from Petersburg to Moscow
    P6961感觉很神奇的题。一条路径的代价是前\(k\)大的边的权值和,有个假的做法是每个点维护一个堆,表示走到这个点前\(k\)大边的权值,读者可以思考一下这个做法为什么是假的。既然直接最短路不好处理,自己观察性质,可以发现前\(k\)条边权值和等价于每条边边权变为\(\max(val-va......
  • 【POJ 3275】Ranking the Cows 题解(传递闭包)
    农夫约翰的N头奶牛(1≤N≤1000)产奶率各不相同,FJ希望根据这些比率从最快的奶牛到最慢的奶牛订购奶牛。FJ已经比较了M(1≤M≤10000)对奶牛的产奶率。他想列出另外C对奶牛的列表,这样,如果他现在比较这些C对奶牛,他肯定能够推断出所有N头牛的正确顺序。请帮助他确定C的最小值,这样的列表是可......
  • POJ 2186-Popular Cows ---强连通分量
    本题让求有多少点 是图中所有点都可到达改点的定理:在一个有向图中,如果有一个节点的出度为0,并且仅有一个这样的点,则该图中所有的点都可到达该点先求出图的强连通分量,然后将每个强连通分量化为一个层次,求是否存在一个强连通分量,该分量的出度为一,并且仅有一个这样的分量,则该连通分量......
  • 【LuoGu】3047 Nearby Cows G ——两次DFS+树上DP
    [USACO12FEB]NearbyCowsG题目描述给你一棵\(n\)个点的树,点带权,对于每个节点求出距离它不超过\(k\)的所有节点权值和\(m_i\)。输入格式第一行两个正整数\(n,k\)。接下来\(n-1\)行,每行两个正整数\(u,v\),表示\(u,v\)之间有一条边。最后\(n\)行,每行一个非负整数......
  • mailcow - 搭建自己的邮件服务器
    title:mailcow-搭建自己的邮件服务器tags:邮件category:/小书匠grammar_cjkRuby:true欢迎使用{小书匠}(xiaoshujiang)笔记软件,您可以通过小书匠主按钮>模板里的模板管理来改变新建文章的内容。小书匠是一款本地优先,去中心化,分布式,支持选择性同步的全平台覆盖笔记......
  • Detours编译
    CMD进入Detours-master目录下nmake会报错 使用VS的本机工具命令提示符进入Detours-master目录下nmake  ......