【USACO2.4.3】【洛谷P1522】牛的旅行【最短路】【并查集】

P1522 [USACO2.4]牛的旅行 Cow Tours(Floyd多源最短路) 洛谷:牛的旅行 Cow son Tours 毒瘤题意(确信) 此题数据很小,但题意不好分析 洛谷题解整理的概念就很好(分析能力%%%): 牧区: 对应一个点。 牧区之间的距离:实际上是两点之间的 最短路。 不要理解成欧几里得距离。只有 直接连接 的时候,才可以计算欧几里得距离。 牧场: 一个连通块。 牧场直径: 一个牧场的直径是这个牧场所有的牧区(点)之间 距离 的最大值。 说的绕一点就是 所有的任意两点间的最短路的最大值。 使用一条边连接两个牧场,使得合成的一个新的牧场的直径最小。意思是加入一条边之 阅读详情

题目大意:

题目链接:

USACO:http://train.usaco.org/usacoprob2?a=TyEfGmq7aAo&S=cowtour
洛谷:https://www.luogu.org/problemnew/show/P1522

有一个无向图,可以在两个不同的联通块中选择其中两个结点并连接,求此时的新联通块的最远两点之间的距离的最小值。


思路:

n ≤ 150 n\leq150 n≤150的数据很明显是在提示我们用 F l o y d Floyd Floyd做。那么我们就可以求出任意两点之间的距离。
此时可以选择枚举任意两点 i , j i,j i,j,如果这两点不在一个联通块( d i s [ i ] [ j ] > I n f dis[i][j]>Inf dis[i][j]>Inf),那么就可以 O ( n ) O(n) O(n)求出这两个点和同一联通块的最远点之间的距离,然后更新答案
a n s = m i n ( a n s , s u m 1 + s u m 2 + c a l ( i , j ) ) ans=min(ans,sum1+sum2+cal(i,j)) ans=min(ans,sum1+sum2+cal(i,j))
最终取个 6 6 6位小数就可以了。
然后就可以得到 90 90 90分的高分。
此时再打个表就过了


关于# 7 7 7

它死了。
为什么会这样呢?
我们发现,每次更新 a n s ans ans的时候,是把新联通块的新加入的边看成最长路径中的一条了。那么有没有可能加入这条边之后最长路依然只存在其中的一个旧联通块中呢?
有可能。
那么就得先把所有联通块的最长路求出来,然后再更新 a n s ans ans的时候再加入两个条件:
a n s = m i n ( a n s , m a x ( s u m 1 + s u m 2 + c a l ( i , j ) , m a x ( s 1 , s 2 ) ) ) ans=min(ans,max(sum1+sum2+cal(i,j),max(s1,s2))) ans=min(ans,max(sum1+sum2+cal(i,j),max(s1,s2)))
其中 s 1 , s 2 s1,s2 s1,s2分别表示新边所连接的两个旧联通块的最长路。
但是这样就必须用并查集了。
时间复杂度: O ( n 3 α ( n ) ) O(n^3\alpha(n)) O(n3α(n))


代码:

/*
ID:ssl_zyc2
TASK:cowtour
LANG:C++
*/
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;

const int N=200;
const double Inf=1e9;
int n,x[N],y[N],map[N][N],father[N];
double dis[N][N],sum1,sum2,ans,maxn[N];

double cal(double x1,double x2,double y1,double y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

int find(int x)
{
	return x==father[x]?x:father[x]=find(father[x]);
}

int main()
{
	freopen("cowtour.in","r",stdin);
	freopen("cowtour.out","w",stdout);
	ans=Inf;
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		father[i]=i;
	}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		{
			scanf("%1d",&map[i][j]);
			if (map[i][j]==1)
			{
				dis[i][j]=cal(x[i],x[j],y[i],y[j]);  //求路径长度
				father[find(j)]=find(i);
			}
			else dis[i][j]=Inf+1.0;
		}
	for (int k=1;k<=n;k++)  //Floyd
		for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++)
				if (i!=j&&j!=k&&k!=i)
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			if (find(i)==find(j)&&i!=j)
				maxn[find(i)]=max(maxn[find(i)],dis[i][j]);  
				//maxn[i]表示含i的联通块的最长路
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)  //枚举任意两点
			if (i!=j&&find(i)!=find(j))
			{
				sum1=0;
				sum2=0;
				for (int k=1;k<=n;k++)
				{
					if (find(i)==find(k)&&i!=k)
						sum1=max(sum1,dis[i][k]);
					if (find(j)==find(k)&&j!=k)
						sum2=max(sum2,dis[j][k]);
				}
				ans=min(ans,max(sum1+sum2+cal(x[i],x[j],y[i],y[j]),max(maxn[find(i)],maxn[find(j)])));
			}
	printf("%6lf\n",ans);
	return 0;
}
Floyd算法实战:从信息学奥赛到洛谷P1522,如何优化牛的旅行路径? 本文通过洛谷P1522「牛的旅行」这道USACO竞赛题目,详细解析了Floyd算法在图论问题中的实战应用。从问题建模到算法实现,再到优化技巧,全面展示了如何利用Floyd算法解决牧场路径优化问题,帮助读者深入理解这一经典算法的实际应用场景和解题思路。 阅读详情

相关推荐

TJA1445/TJA1465 CAN收发器硬件设计与软件配置实战指南

控制器局域网(CAN)总线是汽车电子和工业控制领域实现电子控制单元(ECU)间可靠通信的核心技术。其工作原理是将数字信号转换为差分信号进行抗干扰传输,技术价值在于构建稳定、高效的分布式实时控制系统。随着汽车电子架构向域集中式演进,对CAN总线的通信速率、网络复杂度和静态功耗提出了更高要求,这催生了支持CAN FD协议和智能电源管理的新一代高速CAN收发器。在车载网关、域控制器及工业网络节点等应用场景中,NXP的TJA1445和TJA1465系列收发器凭借其部分组网(Partial Networking)和选

weixin_29655587的博客 409

【Floyd多源最短路】牛的旅行

本题考察了图论中最短路径算法的应用,特别是Floyd算法的使用。关键在于理解牧场直径的定义,以及如何通过连接两个牧场来最小化新牧场的直径。Floyd算法虽然时间复杂度较高,但对于N≤150的数据规模是完全可行的。

hongjianMa的博客 401

【LabVIEW懒人系列教程-视觉入门】2.6LabVIEW模板匹配之创建模板

上期2.5在Labview软件框架中实现了模板匹配功能的运用,然而我们的模板图像是通过视觉助手创建出来的,在实际项目中这样做 ,难免有些不妥。所以,今天就给大家讲解一下,如何编写创建模板功能,模板图像的创建与加载需要注意一些什么。 模板图片的创建,大家可以理解为将图像中的一个特征区域扣下来,通过Labview函数进行信息学习,然后保存成带有图像信息的模板图。 具体做法,下面为大家演示一下 百度网盘视频链接:https://pan.baidu.com/s/1-zxcJBxPgk4t1Ej..

视觉龙哥 2167

USACO 2.4 牛的旅行 【最短路Floyed算法】

USACO 2.4 牛的旅行 (最短路) Time Limit:10000MS Memory Limit:65536K Total Submit:102 Accepted:68 Case Time Limit:1000MS Description   农民JohnJohnJohn的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧...

在人间贩卖声音 281

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1970

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1241

【算法】牛的旅行(图的直径,floyd算法求最短路)

农民John的农场里有很多牧区,有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区不连通。现在,John想在农场里(注意,恰好一条)。一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离)。考虑如下的两个牧场,每一个牧区都有自己的坐标:图 1 是有 5 个牧区的牧场,牧区用“*”表示,路径用直线表示。

littlegengjie的博客 526

[Vue][面试]谈谈你对MVC、MVP和MVVM的理解

谈谈你对MVC、MVP和MVVM的理解 答题思路:此题涉及知识点很多,很难说清楚,说透彻,因为MVC,MVP这些我们前端程序员自己甚至都没用过。但是恰恰反映了前端这些年从无到有, 从有到优的变迁过程,因此沿此思路回答将十分清除。 Web1.0时代 在web1.0时代,并没有前端的概念。开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常由多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、C#/Java/PHP代码, 系统整体架构可能如下图所

你好,欢迎光临! 723

(洛谷入门系列,适合洛谷新用户)洛谷功能全解

对洛谷功能进行详细解说,适合初入洛谷的新手阅读。

rrc12345的博客 10万+

数学建模算法案例精讲500篇-【深度强化学习】深度确定性策略梯度(DDPG)(附MATLAB和python代码实现)

它是一种学习连续动作的无模型策略算法。它结合了DPG(确定性策略梯度)和DQN(深度Q网络)的思想。它利用DQN中的经验重放和延迟更新的目标网络,并基于DPG,可以在连续的动作空间上运行。# 用于生成带有噪声的动作def __init__(self, action_space, mu=0.0, theta = 0.15, max_sigma = 0.3, min_sigma = 0.3, decay_period = 100000):#decay_period要根据迭代次数合理设置# 均值 mu。

qq_36130719的博客 325

Rcpp简介

在数据分析时,代码的运行速率常常是我们所关心的话题之一。小Q往期的文章中也有介绍通过并行计算提升R运行速率的文章。然而R代码自身的运行速率偏慢,具有某种“先天缺陷”。因此,并行R函数的运行时间有时仍然不尽人意。本期小Q与大家分享R的另一提速方式:Rcpp之效率瓶颈突破。 1 什么是Rcpp 在往期的文章中曾讲过,我们在R中尽量采用向量化或内建函数运算,避免自编循环带来的额外时间消耗。然而,算法中有时难以避免循环,若循环部分耗时严重,直接并行含有该循环的算法显得力不从心,此时又该如何?稍有编程知识的读者可

Mrrunsen的博客 2260

洛谷 搜索

dfs:枚举所有的解决方案。 实现:每次判断这步是否可行,不可行就返回;再判断是否为最后一步,是则返回或者输出;否则就是继续搜索。记得搜索结束要回溯。 bfs:找到最快的一条路径。 实现:将合法的下一步,都压入队列中,每次判断队列是否为空,不空则取出队首,继续判断。记录路径的话,就保存它的前驱点,等到终止时,再输出即可。 八皇后****** 每行每列,所有对角线上 都只有一个皇后。 分析:我们逐行...

weixin_42091898的博客 1936

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1334

洛谷P1522 [USACO2.4] 牛的旅行 Cow Tours(并查集+floyd)

John 将会在这两个牧场中各选一个牧区(即从 {A,B,C,D,E} 中选择一个牧区,从 {F,G,H} 中选择一个牧区),然后用一条路径将它们连起来,使得连通后这个新的更大的牧场的直径尽可能小。第 i 行第 j 列的数字为 0,表示 i 号牧区和 j 号牧区之间不存在直接相连的道路。的牧区的路径,使得连上这条路径后,这个更大的新牧场的直径尽可能小。注意,如果两条路径中途相交,我们不认为它们是连通的。这个牧场的直径大约是 12.07106,最远的两个牧区是 A 和 E,它们之间的最短路径是 A→B→E。

m0_71761904的博客 1805

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

信息学奥赛一本通 1343:【例4-2】牛的旅行 | 洛谷 P1522 [USACO2.4] 牛的旅行 Cow Tours

【题目链接】 ybt 1343:【例4-2】牛的旅行 洛谷 P1522 [USACO2.4] 牛的旅行 Cow Tours 【题目考点】 1. 图论 最短路径 Floyd算法 Floyd算法时间复杂度: O(V3)O(V^3)O(V3) 空间复杂度: 邻接矩阵:O(V2)O(V^2)O(V2), 邻接表:O(V+E)O(V+E)O(V+E) 【题目释义】 将题目抽象为图论中的概念: 牧区为顶点,牧场为连通分量,牧场的直径为连通分量中任意两顶点间最短路径长度的最大值。 题目说要在图中选择两顶点,在两顶点间连一

君义NOIP的博客 2400

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

信息学奥赛必备:Floyd算法详解与洛谷P1522题解(含代码优化技巧)

本文深度剖析了Floyd算法的动态规划本质及其在信息学奥赛中的应用,并以洛谷P1522“牛的旅行”为例,详解如何结合并查集、连通分量直径计算等技巧解决复杂图论问题。文章还提供了针对USACO竞赛的进阶学习路径和代码优化策略,帮助选手夯实基础、突破瓶颈。

lll78的博客 956

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

洛谷P1522 牛的旅行 Cow Tours【最短路径】

题目描述 https://www.luogu.org/problemnew/show/P1522 要求找到连接两个牧场以后距离的最大值,首先要计算出每个点的最大距离(能到达它的点到它的最远距离),然后枚举不连通的两个点,计算出这两个点的最远距离之和以及它们之间的距离和,注意算出的最小值要与没联通之前的两点之间最大距离相比,输出最小值。 注意:要初始化两点之间的距离,本身的距离为0. #includ...

ETwinner的博客 388

【洛谷题解/AcWing题解】USACO2.4 洛谷P1522 牛的旅行

本文很长,但是讲的很通俗了。

lovely_cyqの小窝 207

Java代码:luogu 1522 [USACO2.4]牛的旅行 Cow Tours

题目链接:https://www.luogu.com.cn/problem/P1522 题意:有很多牧区,一些相连的牧区形成了牧场,连接两个不在同一个牧场的牧区,形成一个大的牧场,要使得这个新牧场中最远的两个牧区距离尽量小。 N<=150。 题解: dfs处理出所有的牧场,用floyd或者spfa求出同一牧场中点对之间的距离,然后求出距离每个点最远的点的距离。之后暴力枚举所有的连边方式,最长...

GXQ的博客 216

洛谷题单 208【图论2-2】最短路

文章目录P3371 【模板】单源最短路径(弱化版)【模板】单源最短路径(标准版) P3371 【模板】单源最短路径(弱化版) 数据最大为1e4,所以需要用到堆优化和邻接表 //邻接表写法 #include <bits/stdc++.h> #define PUSH(x,y,z) G[x].push_back(P(y,z)) // 宏函数 using namespace std; const int INF = 0x3f3f3f3f, N = 10005; typedef pair<int

默的博客 453

USACO2.4のP1522-牛的旅行(Cow Tours)【最短路Flody】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&amp;pid=P1522 题目大意 有n个点,连接任意两个不同联通块上的点,使这个新的联通块之间最远的两个点的距离最远。 解题思路 先FlodyO(n3)O(n^3)O(n3)计算两两之间的距离 然后计算出每个点最远的点的距离,之后对于枚举两个不同联通块中的点,那么可能产生的新的权...

QuantAsk 1094

Floyd算法实战:从牛的旅行问题看连通分量与最短路径优化

本文以USACO经典题目“牛的旅行”为例,深入解析Floyd算法在图论问题中的实战应用。通过分析连通分量与图直径,详细阐述了如何利用Floyd算法计算全源最短路径,并优化求解修建新路后最小化牧场直径的策略,为算法竞赛选手提供清晰的解题思路和代码实现要点。

python9snake的博客 617

P1522 [USACO2.4] 牛的旅行 Cow Tours(连通块+Floyd)

思路:先用dfs标记一下每个点在哪个连通块,然后求出每个连通块内每个点的最大最短路,求任意两点之间的距离+数据范围,我们可以知道这道题要使用Floyd进行求解,求到了任意两点之间的距离后,我们就可以求出每个点到所在连通块其他点的最短路中的最大值,然后再从同一连通块的所有点的最大值中选出最大值,就是连通块的直径了。题目大意:给你n个坐标点(x,y),再给一个n*n的矩阵,代表两点之间的连边关系,连边之后会构成若干个连通块,定义连通块的直径为最远的两个点的距离(距离指的是两点间最短路径的长度)。

2302_79372568的博客 180

【洛谷】P1522 [USACO2.4]牛的旅行 Cow Tours

#include <bits/stdc++.h> using namespace std; #define maxn 160 #define inf 1e20 struct node{ int x,y; }; double calS(const node &n1,const node &n2){ return sqrt((n1.x-n2.x)*(n1.x-n2.x)+(n1.y-n2.y)*(n1.y-n2.y)); } int nv; int G[maxn.

fftx_00的博客 573

洛谷P1522 牛的旅行 Cow Tours

---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目描述 农民 John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通。这样,Farmer J...

weixin_30795127的博客 94

牛的旅行(acwing和洛谷)

由于洛谷和acwing所求描述不同,题意有所改变 1125. 牛的旅行(acwing) 1125. 牛的旅行 思路 生成的新牧场和原牧场的最大直径 1.floyd算法求出任意两个连通点之间的距离 2.求出所有连通集合中的点到该点最远的距离 3.枚举所有非连通点**maxd[i] + maxd[j] + dist[i,j] ** 即i点在该连通集合中最远的距离 + j点在该连通集合中最远的距离 + i两点的j的实际距离 4.在原牧场和新牧场取最大值即可 样例输入: 8 10 10 15 10 20 10

weixin_53037379的博客 627
上一篇: 【洛谷P3203】弹飞绵羊【分块】
下一篇: 【JZOJ3518】进化序列【模拟】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值