P1354 房间最短路问题(建图&最短路)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1354 房间最短路问题(建图&最短路)相关的知识,希望对你有一定的参考价值。

P1354 房间最短路问题(建图&最短路)

建图跑最短路就行了,两点加边时特判下是否有墙挡住了。这里用floyd就可以过了

// Problem: P1354 房间最短路问题
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1354
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-07-23 14:11:44
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
struct node{
	double x,b[5];
}p[N];
int n;
bool ck(double y,node &u){
	return  (y>=u.b[1]&&y<=u.b[2])||(y>=u.b[3]&&y<=u.b[4]);
}
double dis(double x1,double y1,double x2,double  y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool fun(int i,int j,int k,int l){
	if(j-i<2) return true;
	double x1=p[i].x,x2=p[j].x,y1=p[i].b[k],y2=p[j].b[l];
	double kk=(y1-y2)/(x1-x2),t=y1-kk*x1;
	for(int w=i+1;w<j;w++){
		double tmp=kk*p[w].x+t;
		if(!ck(tmp,p[w])) return false;
	}	
	return true;
}
int id(int x,int y){
	return x*4+y;
}
double d[N][N];
void add(int i,int j,int k,int l){
	if(!fun(i,j,k,l)) return;
	double x1=p[i].x,x2=p[j].x,y1=p[i].b[k],y2=p[j].b[l];
	d[id(i,k)][id(j,l)]=d[id(j,l)][id(i,k)]=dis(x1,y1,x2,y2);
}
int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++){
		scanf("%lf",&p[i].x);
		for(int j=1;j<5;j++) scanf("%lf",&p[i].b[j]);
	}
	p[0].x=0,p[++n].x=10;
	mst(d,127);
	for(int i=1;i<5;i++) p[0].b[i]=p[n].b[i]=5;
	for(int i=0;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			for(int k=1;k<5;k++)
				for(int l=1;l<5;l++)	add(i,j,k,l);
	int tot=4*(n+1);
	for(int i=1;i<=tot;i++) d[i][i]=0;
	for(int k=1;k<=tot;k++)
		for(int i=1;i<=tot;i++)
			for(int j=1;j<=tot;j++){
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
			}
	printf("%.2f\\n",d[1][tot]);
	return 0;
}

以上是关于P1354 房间最短路问题(建图&最短路)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2502 Subway ( 最短路 && 最短路建图 )

[最短路] aw920. 最优乘车(单源最短路建图+bfs最短路模型+知识理解+好题)

CSU 1333 & Uva 12661 Funny Car Racing最短路变形+spfa算法,链式前向星建图

[最短路] aw903. 昂贵的聘礼(单源最短路建图+超级源点+知识理解+好题)

[最短路] aw1128. 信使(单源最短路建图+Floyd算法+最短路理解+模板题)

[最短路] aw1129. 热浪(单源最短路建图+spfa循环队列+模板题)