这是我的代码
#include <bits/stdc++.h>
#define ll long long
#define mkp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+5;
const int M=1e6+5;
struct EDGE
{
int v,next;
double c;
}edge[M];
int head[N],cnt,n,m,tot;double dist[N],f[405][405];
void add_edge(int x,int y,double z)
{
edge[++cnt]=(EDGE){y,head[x],z};
head[x]=cnt;
}
struct Node
{
double x,y;
}air[N];
int s,t,a,b,T[N];
double dis(Node a,Node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
const double eps=1e-6;
Node get_point(Node a,Node b,Node c)
{
Node d;
double disab=dis(a,b);
double disbc=dis(b,c);
double disac=dis(a,c);
double maxdis=max(disab,max(disac,disbc));
if(disab-maxdis>-eps)
{
Node mid;
mid.x=1.0*(a.x+b.x)/2;
mid.y=1.0*(a.y+b.y)/2;
if(mid.x-c.x==0)
{
d.y=mid.y+mid.y-c.y,d.x=c.x;
return d;
}
double k=(mid.y-c.y)/(mid.x-c.x),l=c.y-k*c.x;
d.x=mid.x+mid.x-c.x;
d.y=k*d.x+l;
}
if(disbc-maxdis>-eps)
{
Node mid;
mid.x=1.0*(b.x+c.x)/2;
mid.y=1.0*(b.y+c.y)/2;
if(mid.x-a.x==0)
{
d.y=mid.y+mid.y-a.y,d.x=a.x;
return d;
}
double k=(mid.y-a.y)/(mid.x-a.x),l=a.y-k*a.x;
d.x=mid.x+mid.x-a.x;
d.y=k*d.x+l;
}
if(disac-maxdis>-eps)
{
Node mid;
mid.x=1.0*(a.x+c.x)/2;
mid.y=1.0*(a.y+c.y)/2;
if(mid.x-b.x==0)
{
d.y=mid.y+mid.y-b.y,d.x=b.x;
return d;
}
double k=(mid.y-b.y)/(mid.x-b.x),l=b.y-k*b.x;
d.x=mid.x+mid.x-b.x;
d.y=k*d.x+l;
}
return d;
}
int main()
{
cin>>n;
while(n--)
{
double ans=100000000000;
cin>>s>>t>>a>>b;
tot=0;
for(int i=1;i<=400;i++)
for(int j=1;j<=400;j++)
f[i][j]=1000000000000;
for(int i=1;i<=400;i++)
f[i][i]=0;
for(int i=1;i<=s;i++)
{
for(int j=1;j<=3;j++)
{
tot++;
cin>>air[tot].x>>air[tot].y;
}
cin>>T[i];
air[++tot]=get_point(air[tot-1],air[tot-2],air[tot-3]);
for(int j=1;j<4;j++)
for(int k=j+1;k<=4;k++)
{
int fr=4*(i-1)+j,to=4*(i-1)+k;
double d=dis(air[fr],air[to]);
f[fr][to]=f[to][fr]=d*T[i];
}
}
for(int i=1;i<=s;i++)
{
for(int j=1;j<=s;j++)
{
if(i!=j)
{
for(int k=1;k<=4;k++)
for(int l=1;l<=4;l++)
{
int u=(i-1)*4+k,v=(j-1)*4+l;
double d=dis(air[u],air[v]);
f[u][v]=f[v][u]=d*t;
}
}
}
}
for(int k=1;k<=4*s;k++)
for(int i=1;i<=4*s;i++)
for(int j=1;j<=4*s;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
for(int i=(a-1)*4+1;i<=a*4;i++)
for(int j=(b-1)*4+1;j<=b*4;j++)
ans=min(ans,f[i][j]);
cout<<fixed<<setprecision(1)<<ans<<endl;
}
return 0;
}
我使用的是DEV-C++,能够正确编译运行。
本题中有一组数据
输入
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
输出
214.1
本地运行正确但在洛谷在线IDE以及洛谷评测均为WA。