60求救
查看原帖
60求救
390568
Twistzz__楼主2024/5/26 12:37

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

2024/5/26 12:37
加载中...