算法训练 Car的旅行路线

ALGO-25 Car的旅行路线

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

输入格式

第一行有四个正整数s,t,A,B。
S表示城市的个数,t表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1<=A,B<=S)。
接下来有S行,其中第I行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。

输出格式

共有n行,每行一个数据对应测试数据,保留一位小数。

测试样例

输入:
3 10 1 3
2 2 2 1 1 2 10
2 12 12 2 22 12 1
22 22 22 32 32 22 10

输出:
214.1

数据规模与约定

0<S<=100

这题的描述和测试样例都很犯病,这里我对测试样例进行了修改,但题目描述不变

AC code:

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) {
        InputReader in = new InputReader(System.in);
        int s = in.nextInt(), t = in.nextInt(), A = in.nextInt() - 1, B = in.nextInt() - 1, size = s * 4;
        double res = Double.MAX_VALUE;
        double[][] floyd = new double[size][size];
        initFloyd(in, floyd, s, t, size);
        for (int k = 0; k < size; k++)
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++) floyd[i][j] = Math.min(floyd[i][j], floyd[i][k] + floyd[k][j]);
        for (int i = 0, I = A * 4, J = B * 4; i < 4; i++)
            for (int j = 0; j < 4; j++) res = Math.min(res, floyd[I + i][J + j]);
        System.out.printf("%.1f", res);
    }

    static void initFloyd(InputReader in, double[][] floyd, int s, int t, int size) {
        Node[] nodes = new Node[size];
        int[] noFiy = new int[s];
        int offset = 0;
        for (int city = 0; city < s; city++, offset++){
            for (int i = 0; i < 3; i++) nodes[offset++] = new Node(in.nextInt(), in.nextInt(), city);
            nodes[offset] = Find(nodes[offset - 1], nodes[offset - 2], nodes[offset - 3]);
            noFiy[city] = in.nextInt();
        }
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++) {
                if (i == j) continue;
                if (nodes[i].city == nodes[j].city)
                    floyd[i][j] = floyd[j][i] = Math.sqrt(len(nodes[i], nodes[j])) * noFiy[nodes[i].city];
                else floyd[i][j] = floyd[j][i] = Math.sqrt(len(nodes[i], nodes[j])) * t;
            }
    }

    static int len(Node x, Node y) { return square(x.x - y.x) + square(x.y - y.y); }

    static int square(int n) { return n * n; }

    static Node Find(Node a, Node b, Node c) {
        int AB = len(a, b), BC = len(b, c), AC = len(a, c);
        if (AB + BC == AC) return new Node(a.x + c.x - b.x, a.y + c.y - b.y, a.city);
        else if (AB + AC == BC) return new Node(b.x + c.x - a.x, b.y + c.y - a.y, a.city);
        return new Node(a.x + b.x - c.x, a.y + b.y - c.y, a.city);
    }

    static class Node {
        int x;
        int y;
        int city;

        Node(int x, int y, int city) {
            this.x = x;
            this.y = y;
            this.city = city;
        }
    }

    static class InputReader {

        BufferedReader read;
        StringTokenizer token;
        String delimiters;

        InputReader(InputStream in) { this(in, " \t\n\r\f"); }

        InputReader(InputStream in, String delimiters) {
            this.read = new BufferedReader(new InputStreamReader(in));
            this.token = new StringTokenizer("", this.delimiters = delimiters);
        }

        String next() {
            while (!token.hasMoreTokens())
                try { token = new StringTokenizer(read.readLine(), delimiters);
                } catch (IOException e) { e.printStackTrace(); }
            return token.nextToken();
        }

        int nextInt() { return Integer.parseInt(next()); }
    }
}

有点花里胡哨 . . .

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值