【题解】P1027 Car 的旅行路线
题面
前言
口胡 5min,调试 2h
正文
两点间距离公式啊~
直接建图啊~
计算边权啊~
跑个最短路啊~
考虑 floyd 啊~
要开 double 啊~
直接做做完啦~
代码
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstring>
#define x1 x_1
#define y1 y_1
#define x2 x_2
#define y2 y_2
#define int long long
using namespace std;
const int maxn=128,inf=0x7f7f7f7f;
int s,A,B;
double t;
double x[maxn<<2],y[maxn<<2],T[maxn],dis[maxn][maxn];
inline double ds(double x1,double y1,double x2,double y2){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
inline void floyd(){
for(int k=1;k<=s*4;k++){
for(int i=1;i<=s*4;i++){
for(int j=1;j<=s*4;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
return;
}
signed main(){
int n;
scanf("%lld",&n);
while(n--){
memset(dis,0,sizeof(dis));
scanf("%lld%lf%lld%lld",&s,&t,&A,&B);
for(int i=1;i<=s;i++){
scanf("%lf%lf%lf%lf%lf%lf%lf",&x[(i-1)*4+1],&y[(i-1)*4+1],&x[(i-1)*4+2],&y[(i-1)*4+2],&x[(i-1)*4+3],&y[(i-1)*4+3],&T[i]);
double dab=ds(x[(i-1)*4+1],y[(i-1)*4+1],x[(i-1)*4+2],y[(i-1)*4+2]);
double dac=ds(x[(i-1)*4+1],y[(i-1)*4+1],x[(i-1)*4+3],y[(i-1)*4+3]);
double dbc=ds(x[(i-1)*4+2],y[(i-1)*4+2],x[(i-1)*4+3],y[(i-1)*4+3]);
if(dab+dac==dbc){
x[i*4]=x[(i-1)*4+2]+x[(i-1)*4+3]-x[(i-1)*4+1],y[i*4]=y[(i-1)*4+2]+y[(i-1)*4+3]-y[(i-1)*4+1];
}else if(dab+dbc==dac){
x[i*4]=x[(i-1)*4+1]+x[(i-1)*4+3]-x[(i-1)*4+2],y[i*4]=y[(i-1)*4+1]+y[(i-1)*4+3]-y[(i-1)*4+2];
}else if(dbc+dac==dab){
x[i*4]=x[(i-1)*4+2]+x[(i-1)*4+1]-x[(i-1)*4+3],y[i*4]=y[(i-1)*4+2]+y[(i-1)*4+1]-y[(i-1)*4+3];
}
}
for(int i=1;i<=s*4;i++){
for(int j=1;j<=s*4;j++){
if(i!=j){
if((i-1)/4!=(j-1)/4){
dis[i][j]=t*sqrt(ds(x[i],y[i],x[j],y[j]));
}else{
dis[i][j]=T[(i-1)/4+1]*sqrt(ds(x[i],y[i],x[j],y[j]));
}
}
}
}
floyd();
double ans=inf;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
ans=min(ans,dis[(A-1)*4+i][(B-1)*4+j]);
}
}
printf("%.1lf\n",ans);
}
return 0;
}
后记
不建议抄代码,必须体验这个 rz 的调试过程!
完结撒花!