为什么一直输出 0 啊?悬 2 关
查看原帖
为什么一直输出 0 啊?悬 2 关
995753
__Octhyccc__楼主2024/8/9 17:33

dij 堆优化求条,为什么一直输出 0.0?

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
int n,s,t,a,b,cnt,head[1001],use;
struct Edge{
	int u,v,next;
	double w;
}e[1001];
struct node{
	double w;int now;
	bool operator<(const node&x)const{
		return w>x.w;
	}
};
struct A{
	double x,y;
	int t;
}c[1001];
db ans=1e9+7;
priority_queue<node>q;
db dis[1001];
bool vis[1001];
db D(db x){return x*x;}
db B(db x1,db y1,db x2,db y2){
	return sqrt(D(x1-x2)+D(y1-y2));
}
double __min__(double x,double y){
	return x<y?x:y;
}
pair<db,db> Get_the_Last(db x1,db y1,db x2,db y2,db x3,db y3){
	int F1_2=D(x1-x2)+D(y1-y2);
	int F1_3=D(x1-x3)+D(y1-y3);
	int F2_3=D(x2-x3)+D(y2-y3);
	pair<db,db>f={0.00,0.00};
	if(F1_2+F1_3==F2_3){
		f.first=x2+x3-x1;
		f.second=y2+y3-y1;
	}
	else if(F1_2+F2_3==F1_3){
		f.first=x1+x3-x2;
		f.second=y1+y3-y2;
	}
	else if(F1_3+F2_3==F1_2){
		f.first=x1+x2-x3;
		f.second=y1+y2-y3;
	}
	return f;
}
void add(int u,int v,double w){
	e[++cnt].u=u,e[cnt].v=v;
	e[cnt].w=w,e[cnt].next=head[u];
	head[u]=cnt;
	return;
}
void dij(){
	while(!q.empty()){
		node x=q.top();
		q.pop();
		int u=x.now;
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				q.push({dis[v],v});
			}
		}
	}
}
void clear(){
	memset(head,0,sizeof(head));
	memset(dis,125.00,sizeof(dis));
	memset(vis,0,sizeof(vis));
	ans=1e9+7;use=0;
	memset(e,0,sizeof(e));
}
int main(){
	scanf("%d",&n);
	while(n--){
		scanf("%d%d%d%d",&s,&t,&a,&b);
		for(int p=1;p<=s;p++){
			for(int i=1;i<=3;i++){
				scanf("%lf%lf",&c[++use].x,&c[use].y);
			}
			int Money=0;
			scanf("%d",&Money);
			for(int i=-1;i<=2;i++)c[use-i].t=Money;
			pair<db,db>f=Get_the_Last(c[use-2].x,c[use-2].y,c[use-1].x,
			c[use-1].y,c[use].x,c[use].y);
			c[++use].x=f.first,c[use].y=f.second;
		}
		for(int i=1;i<=s;i+=4){
			for(int j=i+1;j<=s;j++){
				double dist=B(c[i].x,c[i].y,c[j].x,c[j].y);
				if((j-1)/4==(i-1)/4){
					add(i,j,c[i].t*dist);
					add(j,i,c[i].t*dist);
				}
				else{
					add(i,j,t*dist);
					add(j,i,t*dist);
				}
			}
		}
		for(int i=0;i<4;i++){
			memset(vis,0,sizeof(vis));
			memset(dis,0x3f,sizeof(dis));
			int start=a*4-i;
			dis[start]=0,vis[start]=1;
			q.push({0.0,start});
			dij();
			int end=b*4-3;
			for(int j=0;j<4;j++){
				ans=__min__(dis[j+end],ans);
				//cout<<dis[j+end]<<" ";
			}
		}
		printf("%.1lf\n",ans);
		clear();
	}
}
2024/8/9 17:33
加载中...