记录编号 121736 评测结果 AAAAA
题目名称 [NOIP 2001]Car的旅行路线 最终得分 100
用户昵称 Gravatar席一鸣 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2014-09-21 10:21:40 内存使用 0.34 MiB
显示代码纯文本
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct sb
{
	int x,y,c;
}pos[2001];
bool b[201];
double d[101];
int n,tot,costf,st,ed,tc,x[5],y[5],costt[201];
double dis(int x,int y)
{
	double k;
	k=sqrt(pow(pos[x].x-pos[y].x,2)+pow(pos[x].y-pos[y].y,2));
	if(pos[x].c==pos[y].c)
	  k*=costt[pos[x].c];
	else
	  k*=costf;
	return k;
}
double dij(int st)
{
	double min,k;
	int i,j,p;
	memset(b,0,sizeof(b));
	memset(d,100,sizeof(d));
	d[st]=0;
	for(i=1;i<=tot;i++)
	{
		min=1e38;
		for(j=1;j<=tot;j++)
		  if(!b[j]&&d[j]<min)
		  {
		  	min=d[j];
		  	p=j;
		  }
		b[p]=1;
		for(j=1;j<=tot;j++)
		  if(!b[j])
		    d[j]=d[j]>d[p]+dis(p,j)?d[p]+dis(p,j):d[j];
	}
	k=1e38;
	for(i=1;i<=tot;i++)
	{
		if(pos[i].c==ed)
		  for(j=0;j<=3;j++)
		    k=d[i+j]<k?d[i+j]:k;
		if(pos[i].c==ed)
		  break;
	}
	return k;
}
main()
{
	freopen("cardlxlx.in","r",stdin);
	freopen("cardlxlx.out","w",stdout);
	cin>>tc;
	double min=1e38;
	int i,j,k;
	while(tc)
	{
		cin>>n>>costf>>st>>ed;
		for(i=1;i<=n;i++)
		{
			cin>>x[1]>>y[1]>>x[2]>>y[2]>>x[3]>>y[3]>>costt[i];
			for(j=1;j<=3;j++)
			  for(k=1;k<=3;k++)
			    if(j!=k&&(x[j]-x[k])*(x[6-k-j]-x[j])+(y[j]-y[k])*(y[6-k-j]-y[j])==0)
			    {
			    	x[4]=x[k]+x[6-k-j]-x[j];
			    	y[4]=y[k]+y[6-k-j]-y[j];
			    }
			for(j=1;j<=4;j++)
			{
				pos[++tot].x=x[j];
				pos[tot].y=y[j];
				pos[tot].c=i;
			}
		}
		for(i=1;i<=tot;i++)
		{
			if(pos[i].c==st)
			  for(j=0;j<=3;j++)
			    min=dij(i+j)<min?dij(i+j):min;
			if(pos[i].c==st)
			  break;
		}
		printf("%.1lf",min);
		tc--;
	}
	fclose(stdin);
	fclose(stdout);
}