玄学样例
查看原帖
玄学样例
681736
zhengjingtian楼主2024/5/26 12:08

样例没过 提交之后AC了

#include <bits/stdc++.h>
using namespace std;
struct Node{
	int id,x,y;
}a[405];
int n,S,t,A,B,num;
int v[105];
double dis[405];
bool flag[405];
double juli(int x1,int y1,int x2,int y2)
{
	return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
void init(int city)
{
	int x1=a[num-2].x,y1=a[num-2].y,x2=a[num-1].x,y2=a[num-1].y,x3=a[num].x,y3=a[num].y;
	//a(x1,y1) b(x2,y2) c(x3,y3)
	int ab=pow(x1-x2,2)+pow(y1-y2,2),ac=pow(x1-x3,2)+pow(y1-y3,2),bc=pow(x2-x3,2)+pow(y2-y3,2);
	int x,y;
	if(ab+ac==bc)
		x=x2+x3-x1,y=y2+y3-y1;
	if(ab+bc==ac)
		x=x1+x3-x2,y=y1+y3-y2;
	if(bc+ac==ab)
		x=x1+x2-x3,y=y1+y2-y3;
	a[++num].x=x,a[num].y=y,a[num].id=city;
}
double spfa()
{
	memset(dis,0x7f,sizeof(dis));
	memset(flag,false,sizeof(flag));
	
	queue<int> q;
	for(int i=A*4-3;i<=A*4;i++)
	{
		dis[i]=0;
		flag[i]=true;
		q.push(i);
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		flag[u]=false;
		for(int i=1;i<=S*4;i++)
		{
			if(u==i)
				continue;
			double huafei=juli(a[u].x,a[u].y,a[i].x,a[i].y);
//			cout<<huafei<<endl;
			if(a[u].id==a[i].id)
				huafei*=v[a[u].id];
			else
				huafei*=t;
			if(dis[u]+huafei<dis[i])
			{
				dis[i]=dis[u]+huafei;
				if(!flag[i])
				{
					flag[i]=true;
					q.push(i);
				}
			}
		}
	}
	double ans=DBL_MAX;
	for(int i=B*4-3;i<=B*4;i++)
	{
		ans=min(ans,dis[i]);
//		cout<<dis[i]<<endl;
	}
//	for(int i=1;i<=S*4;i++)
//		cout<<dis[i]<<endl;
	return ans;
}
void shuru()
{
	num=0;
	memset(a,0,sizeof(a));
	memset(v,0,sizeof(v));
	cin>>S>>t>>A>>B;
	for(int i=1;i<=S;i++)
	{
		for(int j=1;j<=3;j++)
		{
			cin>>a[++num].x>>a[num].y;
			a[num].id=i;
		}
		init(i);
		cin>>v[i];
	}
}
int main()
{
	cin>>n;
	while(n--)
	{
		shuru();
		printf("%.1lf\n",spfa());
	}
	return 0;
}
2024/5/26 12:08
加载中...