[RQNOJ 216][codevs 1041]Car的旅行路线

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=700000000;
int n,s,t,a,b;
int dx[5],dy[5],x[405],y[405];
double dis[405][405];
double ans;
double getdis(int x1,int y1,int x2,int y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void work()
{
	int ti;
	scanf("%d%d%d%d",&s,&t,&a,&b);
	ans=inf;
	memset(dis,inf,sizeof(dis));
	for(int i=0;i<s;i++)
	{		
		scanf("%d%d%d%d%d%d%d",&dx[0],&dy[0],&dx[1],&dy[1],&dx[2],&dy[2],&ti);
		if((dx[1]-dx[0])*(dx[2]-dx[0])+(dy[2]-dy[0])*(dy[1]-dy[0])==0) 
		{
			dx[3]=dx[1]+dx[2]-dx[0];
			dy[3]=dy[1]+dy[2]-dy[0];	
		}
		if((dx[0]-dx[1])*(dx[2]-dx[1])+(dy[0]-dy[1])*(dy[2]-dy[1])==0) 
		{
			dx[3]=-dx[1]+dx[2]+dx[0];
			dy[3]=-dy[1]+dy[2]+dy[0];	
		}
		if((dx[1]-dx[2])*(dx[0]-dx[2])+(dy[1]-dy[2])*(dy[0]-dy[2])==0) 
		{
			dx[3]=dx[1]-dx[2]+dx[0];
			dy[3]=dy[1]-dy[2]+dy[0];	
		}		
		for(int j=0;j<4;j++) 
		{
			x[4*i+j]=dx[j];y[4*i+j]=dy[j];
		}
		for(int j=0;j<4;j++)
		for(int k=0;k<4;k++)
			dis[4*i+j][4*i+k]=getdis(dx[j],dy[j],dx[k],dy[k])*ti;
		for(int k=0;k<i;k++)
			for(int j=0;j<4;j++)
				for(int l=0;l<4;l++)
				{
					dis[4*i+l][4*k+j]=getdis(x[4*i+l],y[4*i+l],x[4*k+j],y[4*k+j])*t;
					dis[4*k+j][4*i+l]=getdis(x[4*k+j],y[4*k+j],x[4*i+l],y[4*i+l])*t;
				}				
	}
	for(int k=0;k<4*s;k++)
		for(int i=0;i<4*s;i++)
			for(int j=0;j<4*s;j++)
			if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
		if(ans>dis[(a-1)*4+i][(b-1)*4+j]) ans=dis[(a-1)*4+i][(b-1)*4+j];
	printf("%.1lf\n",ans);
}
int main()
{
	scanf("%d",&n);
	while(n--) work();
	return 0;
}

你可能感兴趣的:(图论,floyd,单源最短路)