建图Dijkstra60样例过玄关求调
查看原帖
建图Dijkstra60样例过玄关求调
749811
Licis_Subway楼主2025/1/14 22:34
//2025.1.14 Tue 11:00
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<utility>
#include<vector>
using namespace std;
struct City
{
    int x[5],y[5];
    int ti;
}cts[105];
int s,t,A,B;
const int N=105;
double dist(int x1,int y1,int x2,int y2)
{
    int x=x1-x2,y=y1-y2;
    return sqrt(x*x+y*y);
}
inline int max(const int x,const int y){return x>=y?x:y;}
int triplemax(const int x,const int y,const int z){return max(max(x,y),z);}
inline double min(const double x,const double y){return x<=y?x:y;}
int calc4x(int x)
{
    City cur=cts[x];
    int abdis=dist(cur.x[1],cur.y[1],cur.x[2],cur.y[2]);
    int acdis=dist(cur.x[1],cur.y[1],cur.x[3],cur.y[3]);
    int bcdis=dist(cur.x[2],cur.y[2],cur.x[3],cur.y[3]);
    if(triplemax(abdis,acdis,bcdis)==abdis) return cur.x[1]+cur.x[2]-cur.x[3];
    else if(triplemax(abdis,acdis,bcdis)==bcdis) return cur.x[2]+cur.x[3]-cur.x[1];
    else return cur.x[1]+cur.x[3]-cur.x[2];
}
int calc4y(int x)
{
    City cur=cts[x];
    int abdis=dist(cur.x[1],cur.y[1],cur.x[2],cur.y[2]);
    int acdis=dist(cur.x[1],cur.y[1],cur.x[3],cur.y[3]);
    int bcdis=dist(cur.x[2],cur.y[2],cur.x[3],cur.y[3]);
    if(triplemax(abdis,acdis,bcdis)==abdis) return cur.y[1]+cur.y[2]-cur.y[3];
    else if(triplemax(abdis,acdis,bcdis)==bcdis) return cur.y[2]+cur.y[3]-cur.y[1];
    else return cur.y[1]+cur.y[3]-cur.y[2];
}
const int NN=405;
vector<pair<int,double> > G[NN];
void build()
{
    //同一城市机场之间高铁
    for(int i=1;i<=s;i++)
        for(int j=1;j<=4;j++)
            for(int k=1;k<=4;k++)
            {
                if(j==k) continue;
                double cur=1.0*cts[i].ti*dist(cts[i].x[j],cts[i].y[j],cts[i].x[k],cts[i].y[k]);
                G[i*4+j].push_back(make_pair(i*4+k,cur));
            }
    //机场之间航线
    for(int i=1;i<=s;i++)
        for(int j=1;j<=s;j++)
        {
            if(i==j) continue;
            for(int k=1;k<=4;k++)
                for(int l=1;l<=4;l++)
                {
                    double cur=1.0*t*dist(cts[i].x[k],cts[i].y[k],cts[j].x[l],cts[j].y[l]);
                    G[i*4+k].push_back(make_pair(j*4+l,cur));
                }
        }
}
struct Node
{
    int v;
    double w;
    friend bool operator <(const Node &x,const Node &y){return x.w>y.w;}
};
Node make_node(const int v,const double  w)
{
    Node ans;
    ans.v=v;ans.w=w;
    return ans;
}
bool vis[NN];
double dis[NN];
priority_queue<Node> pq;
void Dijkstra(int st)
{
    for(int i=1;i<=NN-5;i++) dis[i]=1e6;
    memset(vis,0,sizeof vis);
    dis[st]=0.0;
    pq.push(make_node(st,dis[st]));
    while(!pq.empty())
    {
        Node cur=pq.top();
        pq.pop();
        int u=cur.v;
        if(vis[u]) continue;
        vis[u]=true;
        vector<pair<int,double> >::iterator it=G[u].begin();
        for(;it!=G[u].end();it++)
        {
            int v=it->first;
            double w=it->second;
            if((!vis[v])&&dis[u]+w<dis[v])
            {
                dis[v]=dis[u]+w;
                pq.push(make_node(v,dis[v]));
            }
        }
    }
    return;
}
void work()
{
    scanf("%d%d%d%d",&s,&t,&A,&B);
    for(int i=1;i<=s;i++)
    {
        scanf("%d%d%d%d%d%d%d",&cts[i].x[1],&cts[i].y[1],&cts[i].x[2],&cts[i].y[2],&cts[i].x[3],&cts[i].y[3],&cts[i].ti);
        cts[i].x[4]=calc4x(i);
        cts[i].y[4]=calc4y(i);
    }
    build();
    double ans=1e6;
    for(int i=1;i<=4;i++)
    {
        Dijkstra(A*4+i);
        for(int j=1;j<=4;j++) printf("%d %d %.1lf\n",A*4+i,B*4+j,dis[B*4+j]);
    }
    printf("%.1lf\n",ans);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--) work();
    return 0;
}
2025/1/14 22:34
加载中...