记录编号 192462 评测结果 AAAAA
题目名称 [NOIP 2001]Car的旅行路线 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2015-10-11 07:27:28 内存使用 4.19 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
struct dd{
	int end,next;
	double juli;
}jie[250000];
struct dt{
	int x[6]; int y[6];
}at[56];
int tot,head[5000],rt[25][6],num,mo[60],s,t,A,B,T;
double dis[5000];
bool vis[5000];
double Get_dis(int xi,int yi,int xa,int xb){
	return sqrt((at[xi].x[xa]-at[yi].x[xb])*(at[xi].x[xa]-at[yi].x[xb])+(at[xi].y[xa]-at[yi].y[xb])*(at[xi].y[xa]-at[yi].y[xb]));
}
double Get_diss(int xi,int yi,int er){
	return sqrt((at[xi].x[yi]-at[xi].x[er])*(at[xi].x[yi]-at[xi].x[er])+(at[xi].y[yi]-at[xi].y[er])*(at[xi].y[yi]-at[xi].y[er]));
}
void add(int x,int y,double z){
	jie[++tot].end=y; jie[tot].juli=z; jie[tot].next=head[x]; head[x]=tot;
}
void Get_line1(){
	for(int i=1;i<=s;++i)
	  for(int hi=1;hi<=4;++hi)
		for(int j=1;j<=s;++j)
		 for(int hj=1;hj<=4;++hj){
			if(i==j) continue;
			double ty=Get_dis(i,j,hi,hj);
			add(rt[i][hi],rt[j][hj],t*ty);
			add(rt[j][hj],rt[i][hi],t*ty);
		 }

}
void Get_line2(){
	for(int i=1;i<=s;++i)
	 for(int j=1;j<=4;++j)
	   for(int k=1;k<=4;++k){
		if(j==k) continue;
		double ty=Get_diss(i,j,k);
		add(rt[i][j],rt[i][k],mo[i]*ty);
		add(rt[i][k],rt[i][j],mo[i]*ty);
	 }
}
void spfa(int x){
	queue<int>que;
	for(int i=1;i<=num;++i){
		dis[i]=99999999.00; vis[i]=0;
	}
	dis[x]=0.00; vis[x]=1;
	que.push(x);
	while(!que.empty()){
		int yu=que.front(); que.pop(); vis[yu]=0;
		for(int i=head[yu];i;i=jie[i].next){
			int lin=jie[i].end;
			if(dis[lin]>dis[yu]+jie[i].juli){
				dis[lin]=dis[yu]+jie[i].juli;
				if(!vis[lin]){
					vis[lin]=1;
					que.push(lin);
				}
			}
		}
	}
}
void Work(){
	double Minn=9999999.00;
	for(int i=1;i<=4;++i){
		spfa(rt[A][i]);
		for(int j=1;j<=4;++j){
			if(dis[rt[B][j]]<Minn) Minn=dis[rt[B][j]];
		}
	}
	printf("%.1lf\n",Minn);
}
int main(){
    freopen("cardlxlx.in","r",stdin);
	freopen("cardlxlx.out","w",stdout);
	scanf("%d",&T);
  	for(int op=1;op<=T;++op){
	   num=0;
	   scanf("%d%d%d%d",&s,&t,&A,&B);
	   for(int i=1;i<=s;++i){
		  scanf("%d%d%d%d%d%d%d",&at[i].x[1],&at[i].y[1],&at[i].x[2],&at[i].y[2],&at[i].x[3],&at[i].y[3],&mo[i]);
		  for(int j=1;j<=3;j++)
			  for(int k=1;k<=3;k++)
			    if(j!=k&&(at[i].x[j]-at[i].x[k])*(at[i].x[6-k-j]-at[i].x[j])+(at[i].y[j]-at[i].y[k])*(at[i].y[6-k-j]-at[i].y[j])==0)
			    {
			    	at[i].x[4]=at[i].x[k]+at[i].x[6-k-j]-at[i].x[j];
			    	at[i].y[4]=at[i].y[k]+at[i].y[6-k-j]-at[i].y[j];
			    }
	   }
	   for(int i=1;i<=s;++i)
		for(int j=1;j<=4;++j)
		  rt[i][j]=num++;
	   Get_line1(); Get_line2();
	   Work();
	}
	getchar(); getchar();
}