样例没过求调(玄关)
查看原帖
样例没过求调(玄关)
678175
jqQt0220楼主2024/4/20 21:49

比较抽象,见谅

#include<bits/stdc++.h>
using namespace std;
// #define fileio
// #define IOS
void ___()
{
#ifdef fileio
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
#ifdef IOS
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define endl '\n'
#endif
}
#define ll long long
const int _mxn=100+5;
struct node
{
    int v;
    double w;
    node(){}
    node(int _v,double _w):v(_v),w(_w){}
    bool operator<(node x) const {return w>x.w;}
};
vector<node> g[_mxn*4];
void add(int u,int v,double w){g[u].push_back(node(v,w));}
int n,tf,a,b,x[_mxn][6],y[_mxn][6],tt[_mxn];
double dist(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
#define distsq(x1,y1,x2,y2) ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
int id(int k,int i){return (k-1)*4+i;}//第 k 个城市第 i 个机场编号
void ap4(int i)//第 i 个城市第 4 个机场坐标求出来存到数组
{
    double s12=distsq(x[i][1],y[i][1],x[i][2],y[i][2]),
           s23=distsq(x[i][2],y[i][2],x[i][3],y[i][3]),
           s13=distsq(x[i][1],y[i][1],x[i][3],y[i][3]);
    if(s12==s23+s13)
        x[i][4]=x[i][1]+x[i][2]-x[i][3],
        y[i][4]=y[i][1]+y[i][2]-y[i][3];
    else if(s23==s12+s13)
        x[i][4]=x[i][2]+x[i][3]-x[i][1],
        y[i][4]=y[i][2]+y[i][3]-y[i][1];
    else
        x[i][4]=x[i][1]+x[i][3]-x[i][2],
        y[i][4]=y[i][1]+y[i][3]-y[i][2];
}
double dis[4][_mxn*4];//dis[i][j] 表示从城市 A 的第 i 个机场到编号为 j 的机场的最短路
void dijkstra(int i)
{
    priority_queue<node> q;
    q.push(node(id(a,i),0));
    while(!q.empty())
    {
        node k=q.top();q.pop();
        int nw=k.v;
        if(k.w>dis[i][nw])
            continue;
        for(auto it:g[nw])
        {
            int nx=it.v,w=it.w;
            if(dis[i][nx]>dis[i][nw]+w)
            {
                dis[i][nx]=dis[i][nw]+w;
                q.push(node(nx,dis[i][nx]));
            }
        }
    }
}
int main()
{
    ___();
    int _;
    cin>>_;
    while(_--)
    {
        cin>>n>>tf>>a>>b;
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=3;i++)
                cin>>x[k][i]>>y[k][i];
            cin>>tt[k];
            ap4(k);
            cout<<x[k][4]<<" "<<y[k][4]<<endl;
            for(int i=1;i<=4;i++)
                for(int j=i+1;j<=4;j++)
                    add(id(k,i),id(k,j),dist(x[k][i],y[k][i],x[k][j],y[k][j])*tt[k]),
                    add(id(k,j),id(k,i),dist(x[k][i],y[k][i],x[k][j],y[k][j])*tt[k]);
            for(int l=1;l<k;l++)
            {
                for(int i=1;i<=4;i++)
                    for(int j=1;j<=4;j++)
                        add(id(k,i),id(l,j),dist(x[k][i],y[k][i],x[l][j],y[l][j])*tf),
                        add(id(l,j),id(k,i),dist(x[k][i],y[k][i],x[l][j],y[l][j])*tf);
            }
        }
        for(int i=1;i<=4;i++)
            for(int j=1;j<=n*4;j++)
                dis[i][j]=1e9;
        for(int i=1;i<=4;i++)
            dis[i][id(a,i)]=0;
        double ans=1e9;
        int asi,asj;
        for(int i=1;i<=4;i++)
        {
            dijkstra(i);
            for(int j=1;j<=4;j++){
                if(ans>dis[i][id(b,j)])
                ans=min(ans,dis[i][id(b,j)]),asi=i,asj=j;
            }
        }
        cout<<asi<<" "<<asj<<endl;
        printf("%.1lf\n",ans);
    }
    return 0;
}

样例输出 46.0

2024/4/20 21:49
加载中...