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();
}
}