蒟蒻求助
查看原帖
蒟蒻求助
380019
xieyikai2333楼主2021/11/6 11:37

样例过不了,#1 AC,#2345 WA

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef pair<int,double> PID;
typedef pair<double,int> PDI;
struct airport
{
	int x,y;
}a[100005];
double dis[100005];
bool vis[100005];
vector<PID> nodes[100005];
priority_queue<PDI,vector<PDI>,greater<PDI> > pq;
PII getd(int xa,int xb,int xc,int ya,int yb,int yc)
{
	int xd,yd;
	double AB2=(xa-xb)*(xa*xb)+(ya-yb)*(ya-yb);
	double AC2=(xa-xc)*(xa*xc)+(ya-yc)*(ya-yc);
	double BC2=(xb-xc)*(xb*xc)+(yb-yc)*(yb-yc);
	if(AB2+AC2==BC2)xd=xb+xc-xa,yd=yb+yc-ya;
    if(AB2+BC2==AC2)xd=xa+xc-xb,yd=ya+yc-yb;
    if(AC2+BC2==AB2)xd=xa+xb-xc,yd=ya+yb-yc;
    return make_pair(xd,yd);
}
void add(int u,int v,double w)
{
	nodes[u].push_back(make_pair(v,w));
	nodes[v].push_back(make_pair(u,w));
	return;
}
double d(int pa,int pb)
{
	return sqrt(double((a[pa].x-a[pb].x)*(a[pa].x-a[pb].x)+(a[pa].y-a[pb].y)*(a[pa].y-a[pb].y)));
}
void dijkstra()
{
	pq.push(make_pair(dis[0],0));
	while(!pq.empty())
	{
		int u=pq.top().second;
		pq.pop();
		if(!vis[u])
		{
			vis[u]=true;
			for(int i=0,len=nodes[u].size();i<len;i++)
			{
				int v=nodes[u][i].first;
				double w=nodes[u][i].second;
				if(dis[v]>dis[u]+w)
				{
					dis[v]=dis[u]+w;
					pq.push(make_pair(dis[v],v));
				}
			}
		}
	}
	return;
}
void solve()
{
	int s,A,B;
	double t;
	scanf("%d %lf %d %d",&s,&t,&A,&B);
	for(int i=0;i<=4*s+1;i++)nodes[i].clear();
	for(int i=1;i<=s;i++)
	{
		double T;
		scanf("%d %d %d %d %d %lf",&a[i*4-3].x,&a[i*4-3].y,&a[i*4-2].x,&a[i*4-2].y,&a[i*4-1].x,&a[i*4-1].y,&T);
		PII G=getd(a[i*4-3].x,a[i*4-3].y,a[i*4-2].x,a[i*4-2].y,a[i*4-1].x,a[i*4-1].y);
		a[i*4].x=G.first,a[i*4].y=G.second;
		add(i*4-3,i*4-2,d(i*4-3,i*4-2)*T);
		add(i*4-3,i*4-1,d(i*4-3,i*4-1)*T);
		add(i*4-3,i*4,d(i*4-3,i*4)*T);
		add(i*4-2,i*4-1,d(i*4-2,i*4-1)*T);
		add(i*4-2,i*4,d(i*4-2,i*4)*T);
		add(i*4-1,i*4,d(i*4-1,i*4)*T);
	}
	for(int i=1;i<=s;i++)for(int j=0;j<=3;j++)for(int k=i*4+1;k<=s*4;k++)add(i*4-j,k,d(i*4-j,k)*t);
	nodes[0].push_back(make_pair(4*A-3,0));
	nodes[0].push_back(make_pair(4*A-2,0));
	nodes[0].push_back(make_pair(4*A-1,0));
	nodes[0].push_back(make_pair(4*A,0));
	nodes[4*B-3].push_back(make_pair(4*s+1,0));
	nodes[4*B-2].push_back(make_pair(4*s+1,0));
	nodes[4*B-1].push_back(make_pair(4*s+1,0));
	nodes[4*B].push_back(make_pair(4*s+1,0));
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=4*s+1;i++)dis[i]=INT_MAX/3;
	dijkstra();
	printf("%.1lf\n",dis[4*s+1]);
	return;
}
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)solve();
	return 0;
}
2021/11/6 11:37
加载中...