这个题很好啊。。。
建好图后直接跑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();
}
}