洛谷千题详解 | P1027 [NOIP2001 提高组] Car 的旅行路线【C++语言】

news2025/1/17 15:20:37

博主主页:Yu·仙笙

专栏地址:洛谷千题详解

 

目录

题目描述

输入格式

输出格式

输入输出样例

解析:

0.0.题意:

1.1.建图

2.2.最短路

C++源码:

C++源码2:

C++源码3:


-------------------------------------------------------------------------------------------------------------------------------- 

 

-------------------------------------------------------------------------------------------------------------------------------- 

题目描述

又到暑假了,住在城市 A 的 Car 想和朋友一起去城市旅游。
她知道每个城市都有 44 个飞机场,分别位于一个矩形的 44 个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第 ii 个城市中高速铁路了的单位里程价格为 T_iTi​,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为 tt。

图例(从上而下)

机场
高速铁路
飞机航线

注意:图中并没有标出所有的铁路与航线。

那么 Car 应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。

找出一条从城市 A 到 B 的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

-------------------------------------------------------------------------------------------------------------------------------- 

输入格式

第一行为一个正整数 nn,表示有 nn 组测试数据。

每组的第一行有 44 个正整数 s,t,A,Bs,t,A,B。

SS 表示城市的个数,tt 表示飞机单位里程的价格,AA,BB 分别为城市A,B 的序号。

接下来有 SS 行,其中第 ii 行均有 77 个正整数x_{i1},y_{i1},x_{i2},y_{i2},x_{i3},y_{i3},T_ixi1​,yi1​,xi2​,yi2​,xi3​,yi3​,Ti​ ,这当中的 (x_{i1},y_{i1}xi1​,yi1​),(x_{i2},y_{i2}xi2​,yi2​),(x_{i3},y_{i3}xi3​,yi3​)分别是第 ii 个城市中任意 33 个机场的坐标,T_iTi​ 为第 ii 个城市高速铁路单位里程的价格。

-------------------------------------------------------------------------------------------------------------------------------- 

输出格式

共有 nn 行,每行 11 个数据对应测试数据。
保留一位小数。

-------------------------------------------------------------------------------------------------------------------------------- 

输入输出样例

输入 #1复制

1
3 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3

输出 #1复制

47.5

-------------------------------------------------------------------------------------------------------------------------------- 

解析:

这个题啊,真是好写,也不好写。

好写呢,在于建个图,再跑一遍FloydFloyd,比较最小值,就没了

不好写呢,就在于:

1.每个矩形只给了3个点.....

2.代码长(可能不是),相近的变量多(这是我)等等

来一步一步分析吧。。。

0.0.题意:

(略)

1.1.建图

(1).(1).找到矩形的另外11个点

这个东西咋找呢?用亿点初中几何知识知道矩形是平行四边形,而平行四边形是对角线互相平分的。

如图所示:

其中,点A,B,CA,B,C为输入的点,DD是所求的点,对角线交点为PP

这个例子中,BCBC是一条对角线,ADAD是另一条。根据中点公式,可以得到

\begin{cases}x_P=\dfrac{x_B+x_C}{2}\\x_P=\dfrac{x_A+x_D}{2}\end{cases}⎩⎪⎨⎪⎧​xP​=2xB​+xC​​xP​=2xA​+xD​​​

\begin{cases}y_P=\dfrac{y_B+y_C}{2}\\y_P=\dfrac{y_A+y_D}{2}\end{cases}⎩⎪⎨⎪⎧​yP​=2yB​+yC​​yP​=2yA​+yD​​​

所以可得

\begin{cases}x_D=x_B+x_C-x_A\\y_D=y_B+y_C-y_A\end{cases}{xD​=xB​+xC​−xA​yD​=yB​+yC​−yA​​

于是, 我们再用勾股定理判断一下哪两个点构成对角线,然后就能求出这个点啦!

(2).(2).建图

这里我们发现题目给了两种路线,一种是城市之间的航空路线,一种是城市内部的公路。

所以建图的主要问题就在于判断两个点是否在同一城市内。

这个问题,要靠你标点的方式确定,此处就举本人的例子来说明。

我的想法是第11个城市标号1,2,3,41,2,3,4,第22个城市标号5,6,7,85,6,7,8,以此类推。

那么这些点的标号与对应的城市号有什么关系呢?

经过研究发现,若点的编号为ii,则它对应的城市编号即为(i-1)/4(i−1)/4(下取整)

于是这样就行了。

2.2.最短路

emmmemmm,一看数据范围,s \leq 100s≤100

所以最多只有400400个点,O(n^3)O(n3)都能过。

那么O(n^3)O(n3)的最短路是啥?FloydFloyd啊~

跑一遍FloydFloyd,然后求一下AA的每个机场到BB的每个机场的最小值就过了~

-------------------------------------------------------------------------------------------------------------------------------- 

C++源码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,a,b) for(int i=a;i<=b;i++)
const ll inf=0x7f7f7f7f;
ll s,A,B,TTT;
double ans=inf,t,dis[410][410];
double x[410],y[410],T[110];
double diss(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
double ds(double x1,double y1,double x2,double y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}
int main() {
    scanf("%lld",&TTT);
    while(TTT--){
        memset(dis,0,sizeof(dis)),ans=inf;
        scanf("%lld%lf%lld%lld",&s,&t,&A,&B);
        f(i,1,s){
            scanf("%lf%lf%lf%lf%lf%lf%lf",&x[(i-1)*4+1],&y[(i-1)*4+1],&x[(i-1)*4+2],&y[(i-1)*4+2],&x[(i-1)*4+3],&y[(i-1)*4+3],&T[i]);
            double dab=ds(x[(i-1)*4+1],y[(i-1)*4+1],x[(i-1)*4+2],y[(i-1)*4+2]);
            double dac=ds(x[(i-1)*4+1],y[(i-1)*4+1],x[(i-1)*4+3],y[(i-1)*4+3]);
            double dbc=ds(x[(i-1)*4+2],y[(i-1)*4+2],x[(i-1)*4+3],y[(i-1)*4+3]);
            if(dab+dac==dbc)x[i*4]=x[(i-1)*4+2]+x[(i-1)*4+3]-x[(i-1)*4+1],y[i*4]=y[(i-1)*4+2]+y[(i-1)*4+3]-y[(i-1)*4+1];else
            if(dab+dbc==dac)x[i*4]=x[(i-1)*4+1]+x[(i-1)*4+3]-x[(i-1)*4+2],y[i*4]=y[(i-1)*4+1]+y[(i-1)*4+3]-y[(i-1)*4+2];else
            if(dbc+dac==dab)x[i*4]=x[(i-1)*4+2]+x[(i-1)*4+1]-x[(i-1)*4+3],y[i*4]=y[(i-1)*4+2]+y[(i-1)*4+1]-y[(i-1)*4+3];
        }
        f(i,1,s*4)f(j,1,s*4)if(i!=j){
                if((i-1)/4!=(j-1)/4)dis[i][j]=t*diss(x[i],y[i],x[j],y[j]);
                else dis[i][j]=T[(i-1)/4+1]*diss(x[i],y[i],x[j],y[j]);
            }
        f(k,1,s*4)f(i,1,s*4)f(j,1,s*4)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
        f(i,1,4)f(j,1,4)ans=min(ans,dis[(A-1)*4+i][(B-1)*4+j]);
        printf("%.1lf\n",ans);
    }
	return 0;
}

-------------------------------------------------------------------------------------------------------------------------------- 

C++源码2:

#include<cstdio>
#include<cmath>
#include<cstring>
#define maxn 200002
#define I return
#define LIKE 0
#define luogu ;
using namespace std;
struct tnode{
    int x,y;
    int city;//x代表城市横坐标,y代表纵坐标,city代表它所属的城市 
}edge[maxn];
int s,t,A,B;
double f[20002];//存火车费用(注意存的是城市里的) 
double fll[1001][1001];//等会儿建图 
double fac(int x) { 
    return x*x; 
}
double distan(int x1, int y1, int x2, int y2) { 
       return 1.0*sqrt(1.0*fac(x1-x2)+1.0*fac(y1-y2)); 
}
void universe(int x1,int y1,int x2,int y2,int x3,int y3,int i) {
    int ab=fac(x1-x2)+fac(y1-y2);
    int bc=fac(x2-x3)+fac(y2-y3);
	int ac=fac(x1-x3)+fac(y1-y3);
    int x4,y4; //求第四个点的坐标,先判断出直角,然后就好办了 
    if (ab+ac==bc) x4=x2+x3-x1, y4=y2+y3-y1;
    if (ab+bc==ac) x4=x1+x3-x2, y4=y1+y3-y2;
    if (bc+ac==ab) x4=x1+x2-x3, y4=y1+y2-y3;
    edge[i+3].x=x4;//存入第四个点里 
    edge[i+3].y=y4;
}
double mon(tnode x1,tnode x2){//读入试先已经准备好微操,所以调用很简单 
	double juli=distan(x1.x,x1.y,x2.x,x2.y);
	if(x1.city==x2.city) return 1.0*juli*f[x1.city];
	return 1.0*juli*t;
}
int main() {
    int n;
	double ans=29292992.0;
    scanf("%d",&n);
    while(n--){
    	memset(fll,98,sizeof(fll));//注意一定是98,(好像没有也没问题) 
        memset(edge,0,sizeof(edge));
        scanf("%d%d%d%d",&s,&t,&A,&B);
        for (int i=1; i<=4*s; i=i+4) {//读入微操,扩展点后,city存储原来的点 
            scanf("%d%d%d%d%d%d%lf",&edge[i].x,&edge[i].y,&edge[i+1].x,&edge[i+1].y,&edge[i+2].x,&edge[i+2].y,&f[i/4+1]);
            edge[i].city=edge[i+1].city=edge[i+2].city=edge[i+3].city=i/4+1;
            universe(edge[i].x,edge[i].y,edge[i+1].x,edge[i+1].y,edge[i+2].x,edge[i+2].y,i);
        }
        for(int i=1;i<=s*4;i++)//建图初始化 
           for(int j=1;j<=s*4;j++)
           	    fll[i][j]=1.0*mon(edge[i],edge[j]);
        for(int k=1;k<=s*4;k++)//标准弗洛伊德 
           for(int i=1;i<=s*4;i++)
              if(i!=k)
              for(int j=1;j<=s*4;j++)
                 if(i!=j&&j!=k){
                 	if(fll[i][j]>fll[i][k]+fll[k][j])
                 	   fll[i][j]=fll[i][k]+fll[k][j];
				}
				//在起点和终点四个点中寻找最小值 
		for(int i=A*4-3;i<=A*4;i++)
		   for(int j=B*4-3;j<=B*4;j++){
		   	  if(fll[i][j]<ans) ans=fll[i][j];
		   }
		printf("%.1lf",ans);
    }
    I LIKE luogu
}

 --------------------------------------------------------------------------------------------------------------------------------

C++源码3:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100005,maxm=500005,inf=0x3f3f3f3f;
double e[1005][1005];
int wz[1005][11];
int n,tf;
double dist(int a,int b,int c,int d){
	return sqrt((a-b)*(a-b)*1.0+1.0*(c-d)*(c-d));
}
double dist1(int a,int b,int c,int d){
	return (a-b)*(a-b)*1.0+1.0*(c-d)*(c-d);
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int a,b;
		scanf("%d%d%d%d",&n,&tf,&a,&b);
		for(int i=1;i<=4*n;i++)
		  for(int j=1;j<=4*n;j++)
		    e[i][j]=inf;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=6;j++)
			  scanf("%d",wz[i]+j);
			for(int j=1;j<=5;j+=2)
			{
				wz[i][7]+=wz[i][j];
				wz[i][8]+=wz[i][j+1];
			}
			scanf("%d",wz[i]+9);
			double tp[3];
			int tp2=inf,tp3;
			tp[0]=dist1(wz[i][4],wz[i][6],wz[i][3],wz[i][5]);
			tp[1]=dist1(wz[i][2],wz[i][6],wz[i][1],wz[i][5]);
			tp[2]=dist1(wz[i][2],wz[i][4],wz[i][1],wz[i][3]);
			if(tp[0]+tp[1]==tp[2]){
				wz[i][7]-=2*wz[i][5];wz[i][8]-=2*wz[i][6];
			}
			else if(tp[1]+tp[2]==tp[0]){
				wz[i][7]-=2*wz[i][1];wz[i][8]-=2*wz[i][2];
			}
			else if(tp[0]+tp[2]==tp[1]){
				wz[i][7]-=2*wz[i][3];wz[i][8]-=2*wz[i][4];
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=4;j++)
			  for(int k=j;k<=4;k++)
				{
					int u=(i-1)*4+j,v=(i-1)*4+k;
					double dis=dist(wz[i][j*2-1],wz[i][k*2-1],wz[i][j*2],wz[i][k*2]);
					e[u][v]=e[v][u]=dis*wz[i][9];
				}
		}
		for(int i=1;i<=n;i++)
		  for(int j=1;j<=n;j++)
		    if(i!=j){
		  	for(int k=1;k<=4;k++)
		  	  for(int l=1;l<=4;l++)
		  	    {
		  	    	int u=(i-1)*4+k,v=(j-1)*4+l;
					double dis=dist(wz[i][k*2-1],wz[j][l*2-1],wz[i][k*2],wz[j][l*2]);
					e[u][v]=dis*tf;
				  }
		  }
		for(int k=1;k<=n*4;k++)
		  for(int i=1;i<=n*k;i++)
		    for(int j=1;j<=n*4;j++)
		      if(e[i][j]>e[i][k]+e[k][j])
		          e[i][j]=e[i][k]+e[k][j];
		double ans=inf;
		for(int i=(a-1)*4+1;i<=a*4;i++)
		  for(int j=(b-1)*4+1;j<=b*4;j++)
		    ans=min(ans,e[i][j]);
		printf("%.1lf",ans);
	}
	return 0;
}

  -------------------------------------------------------------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离散数学实践二编程判断关系R的性质【java实现】

文章目录实验要求思路完整代码结果展示实验要求 判断关系 R 是否为自反关系 实验类型&#xff1a;设计性实验目的 通过算法设计并编程实现对给定集合上的关系是否为自反关系的判断&#xff0c;加深学生对关系性质的理解&#xff0c;掌握用矩阵来判断关系性质的方法。 实验内容…

【Python】沃罗诺伊图 | KNN 最邻近算法 | Voronoi 函数

猛戳&#xff01;跟哥们一起玩蛇啊 &#x1f449; 《一起玩蛇》&#x1f40d; 写在前面&#xff1a;上一章我们介绍了介计算几何领域的德劳内三角剖分&#xff0c;我们提到过关于点集的很多种几何图都与德劳内三角剖分密切相关&#xff0c;其中最具代表的就是我们本章要介绍的 …

运营商展望来年再提2B市场,然而拯救4G/5G业务的都是手机用户

2022年即将结束&#xff0c;各个行业都开始进行年终盘点并对来年的业务进行规划&#xff0c;三大运营商也对此进行了展望&#xff0c;媒体报道指运营商对来年的发展偏向于2B市场&#xff0c;这已不是它们第一次提偏重企业市场了&#xff0c;然而现实来看拯救这些运营商的其实一…

详解SpringBean的作用域(Scopes)

文章目录一、SpringBean作用域总览二、"singleton" Bean作用域三、"prototype" Bean作用域1、验证singleton、prototype类型的Bean2、总结四、"request" Bean作用域1、配置2、简介五、"session" Bean作用域1、配置2、简介3、总结sessi…

《哈希表》

【一】哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较&#xff0c;顺序查找时间的复杂度为O(N),平衡树中为树的高度&#xff0c;即O(log2N),搜索的效率取决于搜…

JavaWeb技术栈概述

1.1 Web概述 Web是全球广域网&#xff0c;也称为万维网&#xff08;www&#xff09;&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东、传智官网等这些网站&#xff0c;这些网站统称为Web网站。如下就是通过浏览器访问…

实验三 第四章 MongoDB 副本集

一、实验目的&#xff1a; 了解MongoDB副本集 熟悉MongoDB副本集成员 掌握MongoDB副本集部署 掌握MongoDB副本集操作 理解副本集机制 二、实验环境&#xff1a; 一台win10系统的笔记本电脑 三、实验内容&#xff1a; 4.3部署副本集 4.3.1环境准备 创建的三台虚拟机配置如下&a…

python中的split()、rsplit()、splitlines()用法比较

1 split() 从左向右切割2 rsplit() 从右向左分割3 splitlines() 根据换行符切割4 rsplit()妙用split(分隔符&#xff0c;分割几次)从左向右寻找&#xff0c;分割元素并放入列表中&#xff0c;该分隔符丢弃&#xff1b; rsplit(分隔符&#xff0c;分割几次)从右向左寻找&#x…

算法的复杂性分析

算法的复杂性分析 文章目录算法的复杂性分析0、 算法评价的基本原则1、影响程序运行时间的因素2、算法复杂度2.1 算法的时间复杂度2.2 渐进表示法2.2.1 运行时间的上界2.2. 运行时间的下界2.2.3 运行时间的准确界3、总结4、参考0、 算法评价的基本原则 评价一个算法的好坏实际就…

第二证券|市场短期盘整 不改中期向好格局

12月初以来A股商场全体走势偏弱&#xff0c;上星期首要指数更是五连跌&#xff0c;上证指数重回3100点下方。关于商场近期的再度调整&#xff0c;本周组织观念显现&#xff0c;疫情带来的扰动或是首要原因。 不过&#xff0c;大都组织以为&#xff0c;心情面要素对商场的影响仅…

面试官:ui组件可以自动加载,那么业务组件可以吗?

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 背景 笔者在最近在公司接手了一个老的对内使用的项目&#xff0c;接手后体验了下 发现首屏加载比较慢。分析了下大概的原因是main.js挂…

算法进阶:双指针(一)c++leetcode例题

82. 删除排序链表的重复元素 力扣传送&#xff1a; https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/ 给一个排好序的链表&#xff0c;删除把链表中出现的所有的重复的项&#xff1a; 1 2 2 3 3 3 4 5 -----> 1 4 5 这道题有很多种解法&a…

Unity3D——第一人称FPS生存游戏(resident zombies)

游戏源文件和游戏试玩程序:链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Ln2tFizqEO_uEoQhuxvgrQ?pwdl6w0 提取码&#xff1a;l6w0 游戏思路前身搭建: 用一些正方体和胶囊做出来的基础场景&#xff0c; 人物设计:红色的胶囊体是敌人&#xff0c;手持枪械是…

一文说透BIO以及非阻塞IO

目录1. 一次I/O到底经历了什么2. 什么是Socket3. 阻塞I/O&#xff08;Blocking I/O&#xff0c;BIO&#xff09;3.1. 客户端的socket流程3.1.1. 何为socket&#xff1f;3.1.2. 何为连接&#xff1f;3.2. 服务端的socket流程3.2.1. 创建socket3.2.2. 绑定端口号3.2.3. listen()的…

项目实战之旅游网(六)认证与授权

一.编写相关页面 在本项目中&#xff0c;我们使用Spring Security 进行认证和授权&#xff0c;首先我们先编写相关页面。 1.编写登录页面admin_ login.html 2.编写登录失败页面admin_ fail.html 3.编写权限不足页面no_ permission.html 略过。知道其功能即可。 二.编写配置…

数字孪生城市可视化大屏设计,智慧楼宇开源项目

纵观城市发展历史&#xff0c;技术的革命必然会带动城市内部的变革。当前&#xff0c;以数字孪生为代表的前言信息技术飞速发展&#xff0c;必然会使社会对数字城市的深度和广度有着更为清晰的认知。加快构建数字孪生城市管理平台&#xff0c;通过三维可视化大屏直观展示&#…

图表控件LightningChart.NET 系列教程(六):许可证管理介绍(中)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

Apache ShardingSphere-Proxy <5.3.0 存在身份认证绕过漏洞

漏洞描述 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c;ShardingSphere-Proxy 是支持 MySQL、PostgreSQL 和 openGauss 协议的数据库代理模块。 ShardingSphere-Proxy 5.3.0 之前的版本中在使用 MySQL 作为后端数据库时&#xff0c;在客户端认证失败后没有…

Linux进程状态与优先级

Ⅰ. OS进程状态的概念 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。 在三态模型中&#xff0c;进程状态分为 运行态&#xff0c;就绪态&#xff0c;阻塞态。 在五态模型中&#xff0c;进程状态分为 新建态、终止态&#xff0c;运行态&a…

服务雪崩预防Sentinel

服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了 问题&#xff0c;调用这个服务就会出现线程阻塞的情况&#xff0c;此时若有大量的请求涌入&#xff0c;就会出现多条线程阻塞等 待&#xff0c;进而导致服务瘫痪。 由于…