luoguP1027 Car的旅行路线

这个题很好啊。。。

建好图后直接跑bfs,然后可以把原问题看成单但解决以下这个问题就好了。。

给你一个矩形的三个点坐标,然后问你,第四个点坐标。 。

一开始我懵逼了,,,,

但后来发现,3个点给你显然满足三角不等式
就是说可以确定一个中间点
然后全都向量基(好像是这么叫的)
然后就可以在另一个点变换一下
就可以解决这个问题了

#include<bits/stdc++.h>
using namespace std;

int T;
int s,a,b;
double cost;
double dis[105][5];

struct node{
	double x[5] , y[5];
	double t;
}tu[105];

struct node2{
	int num,tp;//ÄǸö³ÇÊУ¬ÄǸöµã 
	double sum;
};

double val(int x1 , int y1 , int x2 , int y2){
	double dx , dy;
	dx = (tu[x1].x[y1] - tu[x2].x[y2]) * (tu[x1].x[y1] - tu[x2].x[y2]);
	dy = (tu[x1].y[y1] - tu[x2].y[y2]) * (tu[x1].y[y1] - tu[x2].y[y2]);
	if(x1 == x2)return sqrt(dx + dy) * tu[x1].t;
	return sqrt(dx + dy) * cost;
}

void init(){
	cin>>s>>cost>>a>>b;
	for(int i = 1 ; i <= s ; i++){
		cin>>tu[i].x[1]>>tu[i].y[1]>>tu[i].x[2]>>tu[i].y[2]>>tu[i].x[3]>>tu[i].y[3]>>tu[i].t;
		 
		//¸ù¾ÝÈý½Ç²»µÈʽ ,µ½ÁíÍâÁ½µã¾àÀë×îСµÄ¾ÍÊÇÖ±½Çµã¡£¡£¡£ 
		int now = 1;
		double zz = val(i , 1 , i , 2) + val(i , 1 , i , 3);
		if(zz > val(i , 2 , i , 1) + val(i , 2 , i , 3))now = 2 , zz = val(i , 2 , i , 1) + val(i , 2 , i , 3);
		if(zz > val(i , 3 , i , 1) + val(i , 3 , i , 2))now = 3 , zz = val(i , 3 , i , 1) + val(i , 3 , i , 2);
		swap(tu[i].x[now] , tu[i].x[1]);
		swap(tu[i].y[now] , tu[i].y[1]);
		now = 1;
		//´Ëʱ´¦Àí³öÁËÖ±½Çµã×ø±ê , ´ËʱËæ±ãÕÒ¸ö1£¬´úÌæ¡£¡£¡£È»ºó¶Ô2Çó³ö·¨ÏòÁ¿ 
		tu[i].x[4] = tu[i].x[3] - (tu[i].x[1] - tu[i].x[2]);
		tu[i].y[4] = tu[i].y[3] - (tu[i].y[1] - tu[i].y[2]);
	}
	memset(dis , 0x7f , sizeof(dis));
}

void solve(){
	queue<node2>q;
	q.push((node2){a , 1 , 0});
	q.push((node2){a , 2 , 0});
	q.push((node2){a , 3 , 0});
	q.push((node2){a , 4 , 0});
	dis[a][1] = dis[a][2] = dis[a][3] = dis[a][4] = 0;
	while(!q.empty()){
		node2 now = q.front();q.pop();
		for(int i = 1 ; i <= s ; i++){
			for(int j = 1 ; j <= 4 ; j++){
				if(dis[i][j] > now.sum + val(now.num , now.tp , i , j)){
					dis[i][j] = now.sum + val(now.num , now.tp , i , j);
					q.push((node2){i , j , dis[i][j]});
				}
			}
		}		
	}
	double minl = 99999999;
	
	for(int i = 1 ; i <= 4 ; i++){
		minl = min(minl , dis[b][i]);
	}
	printf("%.1f\n",minl);
}

int main(){
	cin>>T;
	while(T--){
		init();
		solve();		
	}
}
发布了80 篇原创文章 · 获赞 3 · 访问量 1734

猜你喜欢

转载自blog.csdn.net/qq_41567618/article/details/104950577