本地运行结果与测试数据一致 附上#2数据
1
3 10 1 3
2 2 2 1 1 2 10
2 12 12 2 22 12 1
22 22 22 32 32 22 10
以及代码(蒟蒻写的不好,勿喷)
#include<bits/stdc++.h>
#define eps 1e-8
using namespace std;
int s;
struct point{
int x,y;
point(int a,int b){
x=a,y=b;
}
};
double dist(point a,point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
struct C{
vector<point> city;
};
C c[200];
double xl(point a,point b){
if(a.x==b.x||a.y==b.y) return 1;
return 0;
}
void f(C &x){
point t1=x.city[0],t2=x.city[1],t3=x.city[2];
if(xl(t1,t2)&&xl(t1,t3)){
//cout<<t2.x+t3.x-t1.x<<" "<<t2.y+t3.y-t1.y<<endl;
x.city.push_back(point(t2.x+t3.x-t1.x,t2.y+t3.y-t1.y));
return;
}
if(xl(t2,t1)&&xl(t2,t3)){
x.city.push_back(point(t1.x+t3.x-t2.x,t1.y+t3.y-t2.y));
return;
}
if(xl(t3,t2)&&xl(t3,t1)){
x.city.push_back(point(t2.x+t1.x-t3.x,t2.y+t1.y-t3.y));
return;
}
}
int n;
double e[410][410];
int t1[105];
void build(int s,int x){
for(int k=0;k<=s-1;k++){
for(int i=0;i<=3;i++){
for(int j=0;j<=3;j++){
if(i==j) continue;
e[k*4+i+1][k*4+j+1]=dist(c[k+1].city[i],c[k+1].city[j])*t1[k+1];
e[k*4+j+1][k*4+i+1]=dist(c[k+1].city[i],c[k+1].city[j])*t1[k+1];
}
}
}
for(int k=0;k<=s-1;k++){
for(int i=0;i<=3;i++){
for(int j=(k+1)*4+1;j<=s*4;j++){
int id=j/4,pos=j%4;
if(j%4!=0) id++;
if(pos==0) pos=4;
e[k*4+i+1][j]=dist(c[id].city[pos-1],c[k+1].city[i])*x;
e[j][k*4+i+1]=dist(c[id].city[pos-1],c[k+1].city[i])*x;
}
}
}
}
void fly(){
for(int k=1;k<=s*4;k++){
for(int i=1;i<=s*4;i++){
for(int j=1;j<=s*4;j++){
e[j][i]=e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
}
}
}
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%d",&n);
while(n--){
for(int i=1;i<=400;i++){
for(int j=1;j<=400;j++){
if(i==j) e[i][j]=0;
else e[i][j]=1e8;
}
}
int t,a,b;
int x,y;
scanf("%d%d%d%d",&s,&t,&a,&b);
for(int i=1;i<=s;i++){
c[i].city.clear();
}
for(int i=1;i<=s;i++){
for(int j=1;j<=3;j++){
scanf("%d%d",&x,&y);
c[i].city.push_back(point(x,y));
}
f(c[i]);
scanf("%d",&t1[i]);
}
build(s,t);
fly();
int start=(a-1)*4,end=(b-1)*4;
double ans=1e8;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
ans=min(ans,e[start+i][end+j]);
}
}
printf("%.1lf",ans);
}
return 0;
}