为什么放在洛谷上编译失败了,自己的dev可以跑?
查看原帖
为什么放在洛谷上编译失败了,自己的dev可以跑?
1053894
humble_person楼主2024/11/24 19:30

#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <limits>
using namespace std;
# define N 404
# define ma 200005
# define ll long long
int x1[N],y1[N],ti[N];
struct edge{
	int to;
	int next;
	double	w;
}e[ma];
int k=0,head[N],s,t,st,en,t1=0,sp=0;
double dis[N],ans;
struct node{
	double dis;
	int po;
	bool operator<(const node& a)const{
		return dis<a.dis;
	}
	bool operator>(const node& a)const{
		return dis>a.dis;
	}
};
priority_queue<node,vector<node>,greater<node> >q;

void add(int u,int v,double w)
{
	k++;
	e[k].to=v;
	e[k].w=w;
	e[k].next=head[u];
	head[u]=k;
}

void dij(int k)
{
	q.push(node{0,k});
	bool vis[4*s]={0};
	for(int i=0;i<=4*s-1;i++)
	{
		dis[i]=99999999;
	}
	dis[k]=0;
	while(!q.empty())
	{
		int k1=q.top().po;
		q.pop();
		if(vis[k1])
		continue;
		vis[k1]=1;
		for(int i=head[k1];i;i=e[i].next)
		{
			int z=e[i].to;
			if(dis[z]>dis[k1]+e[i].w)
			{
				dis[z]=dis[k1]+e[i].w;
				if(vis[z]==0)
				{
					q.push(node{dis[z],z});
				}
			}
		}
	}
}
int main()
{
	int n;
	cin>>n;
	while(n)
	{
		n--;
		k=-1;
		t1=-1;
		sp=-1;
		ans=99999999;
		memset(head,0,sizeof(head));
		cin>>s>>t>>st>>en;
		st--;
		en--;
		for(int i=1;i<=s;i++)
		{
			for(int j=1;j<=3;j++)
			{
				int x,y;
				cin>>x>>y;
				sp++;
				x1[sp]=x;
				y1[sp]=y;
			}
			int x,y;
			double a1,a2,a3;
			a1=((x1[sp]-x1[sp-1])*(x1[sp]-x1[sp-1])+(y1[sp]-y1[sp-1])*(y1[sp]-y1[sp-1]));
			a2=((x1[sp]-x1[sp-2])*(x1[sp]-x1[sp-2])+(y1[sp]-y1[sp-2])*(y1[sp]-y1[sp-2]));
			a3=((x1[sp-1]-x1[sp-2])*(x1[sp-1]-x1[sp-2])+(y1[sp-1]-y1[sp-2])*(y1[sp-1]-y1[sp-2]));
			if(a1==(a2+a3))
			{
				x=x1[sp]+(x1[sp-1]-x1[sp-2]);
				y=y1[sp]+(y1[sp-1]-y1[sp-2]);
			}
			else if(a2==(a1+a3))
			{
				x=x1[sp]+(x1[sp-2]-x1[sp-1]);
				y=y1[sp]+(y1[sp-2]-y1[sp-1]);
			}
			else if(a3==(a1+a2))
			{
				x=x1[sp-1]+(x1[sp-2]-x1[sp]);
				y=y1[sp-1]+(y1[sp-2]-y1[sp]);
			}
			sp++;
			x1[sp]=x;
			y1[sp]=y;
			int tt;
			t1++;
			cin>>tt;
			ti[t1]=tt;
		}
		for(int i=0;i<=4*s-1;i++)
		{
			for(int j=i+1;j<=4*s-1;j++)
			{
				double w=sqrt((x1[i]-x1[j])*(x1[i]-x1[j])+(y1[i]-y1[j])*(y1[i]-y1[j]));
				if(i/4==j/4)
				{
					double w1=w;
					w1=w1*ti[i/4];
					add(i,j,w1);
					add(j,i,w1);
				}
				else{
					w=w*t;
					add(i,j,w);
					add(j,i,w);
				}
			}
		}
		double ans1,ans2,ans3,ans4;
		dij(4*st);
		ans1=min(dis[4*en],min(dis[4*en+1],min(dis[4*en+2],dis[4*en+3])));
		dij(4*st+1);
		ans2=min(dis[4*en],min(dis[4*en+1],min(dis[4*en+2],dis[4*en+3])));
		dij(4*st+2);
		ans3=min(dis[4*en],min(dis[4*en+1],min(dis[4*en+2],dis[4*en+3])));
		dij(4*st+3);
		ans4=min(dis[4*en],min(dis[4*en+1],min(dis[4*en+2],dis[4*en+3])));
		ans=min(ans1,min(ans2,min(ans3,ans4)));
		printf("%.1lf",ans);
		cout<<endl;
	}
	return 0;
}
2024/11/24 19:30
加载中...