1,2,3过了,4,5,样例没有过
cout1和cout2是我在调的时候用的
感觉是Dijk的问题但是我找不不出来
求大佬帮助
#include<bits/stdc++.h>
using namespace std;
struct Node{
int x,y,city;
};
Node q[401];
double dis[401],all=100000000.0;
int s,t,a,b,n,ti[101];
double p[405][405];
struct status{
int now;
double sum;
friend bool operator<(status a,status b){
return a.sum>b.sum;
}
};
int F(int a){
return a*a;
}
int SQ(int a,int b){
return F(q[a].x-q[b].x)+F(q[a].y-q[b].y);
}
void Check(int pos){
int len1=SQ(pos,pos+1),len2=SQ(pos+1,pos+2),len3=SQ(pos+2,pos);
if(len1+len2==len3){
q[pos+3].x=q[pos].x+q[pos+2].x-q[pos+1].x;
q[pos+3].y=q[pos].y+q[pos+2].y-q[pos+1].y;
q[pos+3].city=q[pos].city;
}
if(len1+len3==len2){
q[pos+3].x=q[pos+1].x+q[pos+2].x-q[pos].x;
q[pos+3].y=q[pos+1].y+q[pos+2].y-q[pos].y;
q[pos+3].city=q[pos].city;
}
if(len2+len3==len1){
q[pos+3].x=q[pos+1].x+q[pos].x-q[pos+2].x;
q[pos+3].y=q[pos+1].y+q[pos].y-q[pos+2].y;
q[pos+3].city=q[pos].city;
}
}
double Dis(int a,int b){
return sqrt(F(q[a].x-q[b].x)+F(q[a].y-q[b].y));
}
void Dijkstra(int start){
bool vis[401];
memset(vis,false,sizeof(vis));
priority_queue<status> g;
dis[start]=0;
g.push({start,0});
int u1;
while(!g.empty()){
u1=g.top().now;
double ns=0;
g.pop();
if(vis[u1]==1)continue;
vis[u1]=1;
for(int j=1;j<=4*s;j++){
if(j==u1)continue;
if(q[u1].city==q[j].city)ns=p[u1][j]*ti[(u1-1)/4+1];
else ns=p[u1][j]*t;
if(dis[j]>dis[u1]+ns){
dis[j]=dis[u1]+ns;
g.push({j,dis[j]});
}
}
}
return;
}
void Deal1(){
for(int j=1;j<=s;j++){
cin>>q[(j-1)*4+1].x>>q[(j-1)*4+1].y>>q[(j-1)*4+2].x>>q[(j-1)*4+2].y>>q[(j-1)*4+3].x>>q[(j-1)*4+3].y>>ti[j];
q[(j-1)*4+1].city=j-1,q[(j-1)*4+2].city=j-1,q[(j-1)*4+3].city=j-1,q[(j-1)*4+4].city=j-1;
Check((j-1)*4+1);
}
return;
}
void Deal2(){
for(int j=1;j<=4*s;j++){
for(int k=j+1;k<=4*s;k++){
double sum=Dis(j,k);
p[j][k]=p[k][j]=sum;
/*cout<<"Dis("<<j<<","<<k<<")="<<sum<<" ";
cout<<"ti["<<(j-1)/4+1<<"]="<<ti[(j-1)/4+1]<<endl;*/
}
}
/*cout<<'\n'<<'\n';*/
return;
}
void Cout1(){
for(int j=1;j<=s;j++){
cout<<"city"<<j<<":"<<endl;
for(int k=1;k<=4;k++)cout<<"("<<q[(j-1)*4+k].x<<","<<q[(j-1)*4+k].y<<")"<<endl;
}
return;
}
void Cout2(){
for(int i=1;i<=4*s;i++)cout<<dis[i]<<" ";
return;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>s>>t>>a>>b;
for(int j=1;j<=4*s;j++)dis[j]=100000000.0;
Deal1();
//Cout1();
Deal2();
Dijkstra(a);
//搜索最短价格
for(int j=4*(b-1)+1;j<=4*b;j++)all=min(all,dis[j]);
cout<<fixed<<setprecision(1)<<all<<endl;
//Cout2();
//之后是重新memset
for(int j=1;j<=4*s;j++)q[j].x=0,q[j].y=0,q[j].city=0;
all=100000000.0;
memset(ti,0,sizeof(ti));
for(int j=1;j<=4*s;j++)for(int k=j+1;k<=4*s;k++)p[j][k]=0;
}
return 0;
}