样例不过,#1AC求助
查看原帖
样例不过,#1AC求助
813709
Eric_Shi楼主2024/4/6 11:40
#include <cstdio>
#include <cmath>
using namespace std;

#define MAXS 101
#define INF __DBL_MAX__

int n, S, T, A, B;
double t[MAXS], ans = INF;
double e[MAXS * 4][MAXS * 4];

struct Node {
    int x, y, id;
} a[MAXS * 4];

double min(double x, double y) {
    return x<y ? x : y;
}
int sq(int x) {
    return x * x;
}
int dis_sq(int x1, int y1, int x2, int y2) {
    return sq(x1 - x2) + sq(y1 - y2);
}
double dist(int x1, int y1, int x2, int y2) {
    return sqrt(dis_sq(x1, y1, x2, y2));
}
void GetCoord(int x1, int y1, int x2, int y2, int x3, int y3, int id) {
    int ab = dis_sq(x1, y1, x2, y2);
    int bc = dis_sq(x2, y2, x3, y3);
    int ac = dis_sq(x1, y1, x3, y3);
    int x4, y4;
    if (ab + ac == bc)
        x4 = x2 + x3 - x1, y4 = y2 + y3 - y1;
    if (ab + bc == ac)
        x4 = x1 + x3 - x2, y4 = y1 + y3 - y2;
    if (bc + ac == ab)
        x4 = x1 + x2 - x3, y4 = y1 + y2 - y3;
    a[id*4] = (Node){x4, y4, id};
}

double Value(Node u, Node v) {
    double dis = dist(u.x, u.y, v.x, v.y);
    if (u.id == v.id)
        return dis * t[u.id];
    else
        return dis * T;
}

int main() {
    scanf("%d", &n);
    while (n--) {
        scanf("%d%d%d%d", &S, &T, &A, &B);
        for (int i = 1; i <= S*4; i += 4) {
            int city = i / 4 + 1;
            scanf("%d%d%d%d%d%d%lf", &a[i].x, &a[i].y, &a[i+1].x, &a[i+1].y, &a[i+2].x, &a[i+2].y, &a[i+3].x, &a[i+3].y, t[city]);
            a[i].id = a[i+1].id = a[i+2].id = a[i+3].id = city;
            GetCoord(a[i].x, a[i].y, a[i+1].x, a[i+1].y, a[i+2].x, a[i+2].y, city);
        }
        for (int i = 1; i <= S*4; i++)
            for (int j = 1; j <= S*4; j++)
                e[i][j] = Value(a[i], a[j]);
        for (int k = 1; k <= S*4; k++)
            for (int i = 1; i <= S*4; i++)
                for (int j = 1; j <= S*4; j++)
                    if (i != j && j != k)
                        e[i][j] = min(e[i][j], e[i][k] + e[k][j]);
        for (int i = A*4-3; i <= A*4; i++)
            for (int j = B*4-3; j <= B*4; j++)
                ans = min(ans, e[i][j]);
        printf("%.1lf\n", ans);
    }

    return 0;
}
2024/4/6 11:40
加载中...