Car的旅行路线
问题描述
又到暑假了,住在城市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行,每行一个数据对应测试数据,保留一位小数。
样例输入
1
1 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3
样例输出
47.55 数据规模和约定 0<S<=100,
我们先看看c语言的解法吧
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
#include<cstring>
#include<cmath>
#define Inf 99999999
using namespace std;
struct City
{undefined
float x[4];
float y[4];
float cost;
}city[100];
void Seek(struct City c,float &x3,float &y3)
{undefined
if((c.x[0]-c.x[1])*(c.x[2]-c.x[1])+(c.y[0]-c.y[1])*(c.y[2]-c.y[1])==0) //直角点是(x[1],y[1])
{swap(c.x[0],c.x[1]);swap(c.y[0],c.y[1]);}
else if((c.x[0]-c.x[2])*(c.x[1]-c.x[2])+(c.y[0]-c.y[2])*(c.y[1]-c.y[2])==0)//直角点是(x[2],y[2])
{swap(c.x[0],c.x[2]);swap(c.y[0],c.y[2]);}
x3=c.x[1]+c.x[2]-c.x[0];
y3=c.y[1]+c.y[2]-c.y[0];
}
float dis(struct City a,int index1,struct City b,int index2)
{undefined
return sqrt((a.x[index1]-b.x[index2])*(a.x[index1]-b.x[index2])+(a.y[index1]-b.y[index2])*(a.y[index1]-b.y[index2]));
}
int main()
{undefined
float G[405][405];
int s,t,a,b;
cin>>s>>t>>a>>b;
for(int i=0; i<s; i++)
{undefined
for(int u=0;u<3;u++)
{undefined
cin>>city[i].x[u]>>city[i].y[u];
}
cin>>city[i].cost;
float x3,y3;
Seek(city[i],x3,y3);
city[i].x[3]=x3;
city[i].y[3]=y3;
}
for(int i=0; i<4*s; i++)
for(int j=0; j<4*s; j++)
{undefined
if(i==j)
G[i][j]=0;
else if(i/4==j/4)
G[i][j]=dis(city[i/4],i%4,city[j/4],j%4)*city[i/4].cost;
else
G[i][j]=dis(city[i/4],i%4,city[j/4],j%4)*t;
}
for(int k=0; k<4*s; k++)
for(int i=0; i<4*s; i++)
for(int j=0; j<4*s; j++)
{undefined
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
}
float mindis=Inf;
for(int i=4*a-4; i<4*a; i++)
for(int j=4*b-4; j<4*b; j++)
{undefined
mindis=min(mindis,G[i][j]);
}
printf("%.1f\n",mindis);
return 0;
}
java如何做?
import java.util.Scanner;
public class car的旅行路线 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int cout=in.nextInt();
for (int ss = 0; ss <cout; ss++) {
int s = in.nextInt();
int t = in.nextInt();
int A = in.nextInt();
int B = in.nextInt();
City []cities = new City[s];
for(int i = 0; i < s; i++){
int x1 = in.nextInt();
int y1 = in.nextInt();
int x2 = in.nextInt();
int y2 = in.nextInt();
int x3 = in.nextInt();
int y3 = in.nextInt();
int price = in.nextInt();
City city = new City(x1, y1, x2, y2, x3, y3, price);
cities[i] = city;
}
double [][]dp = new double[s*4][s*4];
for(int i = 0; i < s*4; i++){
for( int j = 0; j < s*4 ;j++){
if(i/4==j/4){
dp[i][j] = dist(cities[i/4].x[i%4],cities[i/4].y[i%4],cities[j/4].x[j%4],cities[j/4].y[j%4])*cities[i/4].price;
}else{
dp[i][j] = dist(cities[i/4].x[i%4],cities[i/4].y[i%4],cities[j/4].x[j%4],cities[j/4].y[j%4])*t;
}
//System.out.println(i+" "+j+" "+dp[i][j]);
}
}
for(int i = 0; i < 4*s;i++){
for(int j = 0; j < 4*s; j++){
for(int k = 0; k < 4*s; k++){
dp[j][k] = Math.min(dp[j][k], dp[j][i]+dp[i][k]);
//System.out.println(j+" "+k+" "+dp[j][k]);
}
}
}
double min = dp[(A-1)*4][(B-1)*4];
//System.out.println(min);
for(int i = (A-1)*4; i <A*4; i++){
for(int j = (B-1)*4; j <B*4; j++){
if(min>dp[i][j]){
min = dp[i][j];
//System.out.println(i+" "+j+" "+min);
}
}
}
System.out.printf("%.1f", min);
}
}
private static double dist(int x12, int y12, int x22, int y22) {
// TODO Auto-generated method stub
return Math.sqrt((x22-x12)*(x22-x12)+(y22-y12)*(y22-y12));
}
}
class City{
int []x = new int[4];
int []y = new int[4];
int price;
public City(int x1, int y1, int x2, int y2, int x3, int y3, int price) {
super();
x[0] = x1;
y[0] = y1;
x[1] = x2;
y[1] = y2;
x[2] = x3;
y[2] = y3;
double t12 = dist(x1,y1,x2,y2);
double t13 = dist(x1,y1,x3,y3);
double t23 = dist(x2,y2,x3,y3);
if(Math.abs(t12*t12+t13*t13-t23*t23)<0.000001){
x[3] = x2+x3-x1;
y[3] = y2+y3-y1;
}
if(Math.abs(t12*t12+t23*t23-t13*t13)<0.000001){
x[3] = x1+x3-x2;
y[3] = y1+y3-y2;
}
if(Math.abs(t13*t13+t23*t23-t12*t12)<0.000001){
x[3] = x1+x2-x3;
y[3] = y1+y2-y3;
}
this.price = price;
}
private double dist(int x12, int y12, int x22, int y22) {
// TODO Auto-generated method stub
return Math.sqrt((x22-x12)*(x22-x12)+(y22-y12)*(y22-y12));
}
}