样例没过 提交之后AC了
#include <bits/stdc++.h>
using namespace std;
struct Node{
int id,x,y;
}a[405];
int n,S,t,A,B,num;
int v[105];
double dis[405];
bool flag[405];
double juli(int x1,int y1,int x2,int y2)
{
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
void init(int city)
{
int x1=a[num-2].x,y1=a[num-2].y,x2=a[num-1].x,y2=a[num-1].y,x3=a[num].x,y3=a[num].y;
//a(x1,y1) b(x2,y2) c(x3,y3)
int ab=pow(x1-x2,2)+pow(y1-y2,2),ac=pow(x1-x3,2)+pow(y1-y3,2),bc=pow(x2-x3,2)+pow(y2-y3,2);
int x,y;
if(ab+ac==bc)
x=x2+x3-x1,y=y2+y3-y1;
if(ab+bc==ac)
x=x1+x3-x2,y=y1+y3-y2;
if(bc+ac==ab)
x=x1+x2-x3,y=y1+y2-y3;
a[++num].x=x,a[num].y=y,a[num].id=city;
}
double spfa()
{
memset(dis,0x7f,sizeof(dis));
memset(flag,false,sizeof(flag));
queue<int> q;
for(int i=A*4-3;i<=A*4;i++)
{
dis[i]=0;
flag[i]=true;
q.push(i);
}
while(!q.empty())
{
int u=q.front();
q.pop();
flag[u]=false;
for(int i=1;i<=S*4;i++)
{
if(u==i)
continue;
double huafei=juli(a[u].x,a[u].y,a[i].x,a[i].y);
// cout<<huafei<<endl;
if(a[u].id==a[i].id)
huafei*=v[a[u].id];
else
huafei*=t;
if(dis[u]+huafei<dis[i])
{
dis[i]=dis[u]+huafei;
if(!flag[i])
{
flag[i]=true;
q.push(i);
}
}
}
}
double ans=DBL_MAX;
for(int i=B*4-3;i<=B*4;i++)
{
ans=min(ans,dis[i]);
// cout<<dis[i]<<endl;
}
// for(int i=1;i<=S*4;i++)
// cout<<dis[i]<<endl;
return ans;
}
void shuru()
{
num=0;
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
cin>>S>>t>>A>>B;
for(int i=1;i<=S;i++)
{
for(int j=1;j<=3;j++)
{
cin>>a[++num].x>>a[num].y;
a[num].id=i;
}
init(i);
cin>>v[i];
}
}
int main()
{
cin>>n;
while(n--)
{
shuru();
printf("%.1lf\n",spfa());
}
return 0;
}