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()); }
}
}
有点花里胡哨 . . .