比较抽象,见谅
#include<bits/stdc++.h>
using namespace std;
// #define fileio
// #define IOS
void ___()
{
#ifdef fileio
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
#ifdef IOS
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n'
#endif
}
#define ll long long
const int _mxn=100+5;
struct node
{
int v;
double w;
node(){}
node(int _v,double _w):v(_v),w(_w){}
bool operator<(node x) const {return w>x.w;}
};
vector<node> g[_mxn*4];
void add(int u,int v,double w){g[u].push_back(node(v,w));}
int n,tf,a,b,x[_mxn][6],y[_mxn][6],tt[_mxn];
double dist(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
#define distsq(x1,y1,x2,y2) ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
int id(int k,int i){return (k-1)*4+i;}//第 k 个城市第 i 个机场编号
void ap4(int i)//第 i 个城市第 4 个机场坐标求出来存到数组
{
double s12=distsq(x[i][1],y[i][1],x[i][2],y[i][2]),
s23=distsq(x[i][2],y[i][2],x[i][3],y[i][3]),
s13=distsq(x[i][1],y[i][1],x[i][3],y[i][3]);
if(s12==s23+s13)
x[i][4]=x[i][1]+x[i][2]-x[i][3],
y[i][4]=y[i][1]+y[i][2]-y[i][3];
else if(s23==s12+s13)
x[i][4]=x[i][2]+x[i][3]-x[i][1],
y[i][4]=y[i][2]+y[i][3]-y[i][1];
else
x[i][4]=x[i][1]+x[i][3]-x[i][2],
y[i][4]=y[i][1]+y[i][3]-y[i][2];
}
double dis[4][_mxn*4];//dis[i][j] 表示从城市 A 的第 i 个机场到编号为 j 的机场的最短路
void dijkstra(int i)
{
priority_queue<node> q;
q.push(node(id(a,i),0));
while(!q.empty())
{
node k=q.top();q.pop();
int nw=k.v;
if(k.w>dis[i][nw])
continue;
for(auto it:g[nw])
{
int nx=it.v,w=it.w;
if(dis[i][nx]>dis[i][nw]+w)
{
dis[i][nx]=dis[i][nw]+w;
q.push(node(nx,dis[i][nx]));
}
}
}
}
int main()
{
___();
int _;
cin>>_;
while(_--)
{
cin>>n>>tf>>a>>b;
for(int k=1;k<=n;k++)
{
for(int i=1;i<=3;i++)
cin>>x[k][i]>>y[k][i];
cin>>tt[k];
ap4(k);
cout<<x[k][4]<<" "<<y[k][4]<<endl;
for(int i=1;i<=4;i++)
for(int j=i+1;j<=4;j++)
add(id(k,i),id(k,j),dist(x[k][i],y[k][i],x[k][j],y[k][j])*tt[k]),
add(id(k,j),id(k,i),dist(x[k][i],y[k][i],x[k][j],y[k][j])*tt[k]);
for(int l=1;l<k;l++)
{
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
add(id(k,i),id(l,j),dist(x[k][i],y[k][i],x[l][j],y[l][j])*tf),
add(id(l,j),id(k,i),dist(x[k][i],y[k][i],x[l][j],y[l][j])*tf);
}
}
for(int i=1;i<=4;i++)
for(int j=1;j<=n*4;j++)
dis[i][j]=1e9;
for(int i=1;i<=4;i++)
dis[i][id(a,i)]=0;
double ans=1e9;
int asi,asj;
for(int i=1;i<=4;i++)
{
dijkstra(i);
for(int j=1;j<=4;j++){
if(ans>dis[i][id(b,j)])
ans=min(ans,dis[i][id(b,j)]),asi=i,asj=j;
}
}
cout<<asi<<" "<<asj<<endl;
printf("%.1lf\n",ans);
}
return 0;
}
样例输出 46.0