`

蓝桥杯-Car的旅行路线

阅读更多

链接地址: http://ayit.acmclub.com/index.php?app=problem_title&id=233&problem_id=21476

 

Car的旅行路线 分数:

时间限制:1 秒
内存限制:128 兆
特殊判题:
提交:2
解决: 1

题目描述

  又到暑假了,住在城市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个城市高速铁路单位里程的价格。

数据规模和约定
  0<S<=100,

输出

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

样例输入

3 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

 

 

最短路径问题

1)算出每个城市的第四个飞机场坐标

2)计算出4×s个点,每两个点的费用

3)Dijkstra算法找最短路

 

#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>

using namespace std ;

#define MAXN 405
#define INF 1e9

struct Point {
    int x , y ;
    Point( int x = 0 , int y = 0 ):x(x),y(y){}
};
Point data[105][4] ;    //城市飞机场的点坐标
int charge[105] ;      //高速公路的费用

Point counter( const Point &a , const Point &b , const Point &c ) { //计算矩形第四个点
     Point ab( b.x-a.x , b.y-a.y ) ;
     Point ac( c.x-a.x , c.y-a.y ) ;
     if( ab.x*ac.x + ab.y*ac.y == 0 ) return Point( b.x+c.x-a.x , b.y+c.y-a.y ) ;
     return counter( c , a , b ) ;
}

double counter( const Point &a , const Point &b ) { //计算两点的距离
    return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ) ;
}

struct Edge {
    int to ;
    double dist ;
    Edge( int to , double dist ):to(to),dist(dist){}
};

struct Node {
    double dist ; //到此点的距离
    int num ;    //点的编号
    Node( int num , double dist ):dist(dist),num(num){}
    bool operator < ( const Node & n ) const {  //小顶堆
        return dist > n.dist ;
    }
};

struct Dijkstra {
    int n ;   //点数
    vector<Edge> edges ; //边列表
    vector<int> G[MAXN] ; //存图
    double d[MAXN] ; //存放结果(费用)

    void init( int n ) {
        this->n = n ;
        for( int i = 1 ; i <= n ; i ++ ) {  //从1开始计数
            G[i].clear() ;
        }
        edges.clear() ;
    }

    void AddEdge( int from , int to , double dist ) {  //注意是有向图
        edges.push_back( Edge(to,dist) ) ;
        G[from].push_back( edges.size()-1 ) ;
    }

    void dijkstra( int s ) { //计算S点到所有点的距离
        for( int i = 1 ; i <= n ; i ++ ) d[i] = INF ; d[s] = 0.0 ;
        bool done[MAXN] ; memset( done , false , sizeof( done ) ) ;
        priority_queue<Node> pq ; pq.push( Node( s , 0.0 ) ) ;
        while( !pq.empty() ) {
            int u = pq.top().num ; pq.pop() ;
            if( done[u] ) continue ;
            done[u] = true ;
            for( int i = 0 ; i < G[u].size() ; i ++ ) {
                int v = edges[ G[u][i] ].to ;
                double dist = edges[ G[u][i] ].dist ;
                if( d[v] > d[u] + dist ) {
                    d[v] = d[u] + dist ;
                    pq.push( Node( v , d[v] ) ) ;
                }
            }
        }
    }

}AC;


int main() {

    int s , t , A , B ; scanf("%d%d%d%d" , &s , &t , &A , &B ) ;

    for( int i = 1 ; i <= s ; i ++ ) {   //输入数据
        for( int j = 0 ; j < 3 ; j ++ ) {
            scanf("%d%d" , &data[i][j].x , & data[i][j].y ) ;
        }
        scanf("%d" , &charge[i] ) ;
    }

    for( int i = 1 ; i <= s ; i ++ ) {  //计算第四个点
        data[i][3] = counter( data[i][0] , data[i][1] , data[i][2] ) ;
    }

    AC.init(MAXN) ;  //存图
    int n = 4*s ;
    int a_col , a_row , b_col , b_row ;
    for( int i = 0 ; i < n ; i ++ ) { //0,1,2,3为一号城市,以此类推
        a_row = i / 4 + 1 ; a_col = i % 4 ;
        for( int j = 0 ; j < n ; j ++ ) if( i != j ) { //计算任意两个点的距离
            b_row = j / 4 + 1 ; b_col = j % 4 ;
            double dist = counter( data[a_row][a_col] , data[b_row][b_col] ) ;
            if( a_row == b_row ) { //如果两个点在同一个城市,则走高速
                AC.AddEdge( i+1 , j+1 , dist*charge[a_row] ) ;
                AC.AddEdge( j+1 , i+1 , dist*charge[a_row] ) ;
            }
            else {
                AC.AddEdge( i+1 , j+1 , dist*t ) ;
                AC.AddEdge( j+1 , i+1 , dist*t ) ;
            }
        }
    }

    double res = INF ;
    for( int i = 4*(A-1)+1 ; i < 4*A+1 ; i ++ ) {  //A点的任意一个机场
        AC.dijkstra( i ) ;
        for( int j = 4*(B-1)+1 ; j < 4*B+1 ; j ++) { //B点的任意一个机场
            if( res > AC.d[j] ) res = AC.d[j] ;
        }
    }
    printf("%.1lf\n" , res ) ;

    return 0 ;
}

 

 

 

 

 

1
1
分享到:
评论

相关推荐

    Infineon FEE integration into RTA-CAR project-RTA Knowledge Base

    Infineon FEE integration into RTA-CAR project-RTA Knowledge Base Infineon FEE integration into RTA-CAR project-RTA Knowledge Base Infineon FEE integration into RTA-CAR project-RTA Knowledge Base ...

    03 - ECU Configuration - RTA-CAR 12.1.0

    ECU Configuration - RTA-CAR 12.1.0 目的:描述了如何从在工作流程02中创建的系统描述中创建ECU提取,配置ECU,并生成BSW、OS和RTE的代码。 工具链:假设使用的是RTA-CAR 12.1.0工具链。 先决条件:需要安装RTA-CAR...

    02 - System Configuration - RTA-CAR 12.1.0

    System Configuration - RTA-CAR 12.1.0 目的:推荐使用导入功能而不是手动配置系统,以将输入文件(如DBC文件)转换为AUTOSAR系统配置。 工具链:同样假设使用的是RTA-CAR 12.1.0工具链。 先决条件:需要安装RTA-...

    Car的旅行路线.zip

    标题“Car的旅行路线.zip”暗示了这是一个与编程竞赛或算法相关的资料包,很可能包含了某个具体问题的题目和解决方案。描述中的“蓝桥杯VIP题和题解”进一步证实了这一点,表明这些文件是蓝桥杯竞赛中的一道高级题目...

    01 - Application Software Configuration - RTA-CAR 12.1.0

    概述了创建新RTA-CAR项目的步骤,包括创建应用程序数据类型、数据类型映射集、发送者/接收者端口接口、SWC原型、端口、内部行为容器、可运行实体、数据访问点、定时事件、组合以及手动创建新连接。 详细步骤: ...

    凯立德C-CAR配置修改器 V4.0

    凯立德C-CAR配置修改器V4.0是一款专为凯立德C-CAR版本地图用户设计的软件工具,其主要功能在于帮助用户自定义和优化导航系统的配置设置。这款修改器允许用户根据个人需求调整地图显示、路线规划、语音播报等各项参数...

    Android-car-eye-device是车辆管理系统的设备端程序负责视频采集gps采集等

    《Android车载监控设备:Car-Eye-Device的深度解析》 在现代的智能交通系统中,车载监控设备扮演着至关重要的角色,它们不仅能够提供实时的视频数据,还能结合GPS定位进行车辆管理。"Android-car-eye-device"正是...

    凯立德C-car配置文件修改器

    C-car是凯立德针对汽车用户推出的一款车载导航系统,集路线规划、实时交通信息、语音导航等功能于一体,旨在提供便捷、精准的出行服务。而配置文件则是C-car系统中存储用户设定和系统参数的文件,包括地图显示设置、...

    R-Car_Gen3_Series_Evaluation_Software_Package_for_Linux-20170427.zip

    1.BSP and Driver package is compatible Ver3.5.3 and higher version. Please check your BSP and Driver version. 2. At the evaluation version library, OpenGL and H.264 codec library are limited at ...

    R-CarM3 使用手册

    R-Car H3/M3 Starter Kit 是一款开发套件,旨在帮助开发者快速开发和评估 R-Car H3 和 R-CarM3 芯片的应用。该套件提供了各种开发工具和示例代码,帮助开发者快速入门和开发汽车信息终端应用。 瑞萨电子公司 瑞萨...

    瑞萨电子推出升级版R-Car V3H,提升深度学习性能满足包括驾乘人员监控系统的最新NCAP要求.pdf

    瑞萨电子推出的升级版R-Car V3H SoC是针对智能摄像头应用进行优化的系统级芯片,特别是满足了最新的NCAP(新车评价程序)要求,包括驾驶员和乘客监控系统(DMS/OMS)。这款产品代表了在深度学习性能上的显著提升,...

    src.rar_V2 _renesas r-car

    在IT行业中,Renesas R-Car是一款由瑞萨电子公司开发的高性能、低功耗的车载系统级芯片(SoC)系列,主要用于汽车信息娱乐系统、驾驶辅助系统以及自动驾驶等应用。标题中的"src.rar_V2_renesas r-car"暗示了这是一个...

    瑞萨电子R-Car系列SoC支持汽车级Linux平台,可加速车载信息娱乐应用的开发.pdf

    瑞萨电子R-Car系列SoC支持汽车级Linux平台可加速车载信息娱乐应用的开发 本文主要介绍了瑞萨电子R-Car系列SoC支持汽车级Linux平台,帮助加速车载信息娱乐应用的开发。同时,文章也涉及到三星推出的全球首款支持6CA...

    gpio-rcar.rar_V2 _renesas_renesas r-car

    在本文中,我们将深入探讨Renesas R-Car GPIO(通用输入/输出)支持在Linux系统中的实现,基于描述中的“Renesas R-Car GPIO Support for Linux v2.13.6”。这个版本的GPIO驱动是专为Renesas R-Car系列微处理器设计...

    xt_rateest.rar_H.R.H._renesas r-car

    标题中的“xt_rateest.rar_H.R.H._renesas r-car”表明这是一个关于Renesas R-Car平台的软件开发资源包,其中可能包含了与视频流处理或性能评估相关的代码。Renesas R-Car是Renesas公司推出的一系列高性能车载系统级...

    瑞萨电子推出其首款R-Car系列的ADAS器件

    的半导体及解决方案供应商瑞萨电子株式会社,日前宣布推出公司开发的片上系统(SoC)R-Car V2H,该产品采用的图像识别技术,支持先进驾驶辅助系统(ADAS)中的高分辨率的环视功能。这是瑞萨推出的首款R-Car系列的ADAS...

    phy-rcar-gen2-usb.rar_renesas r-car

    Renesas R-Car系列是日本瑞萨电子公司推出的一款高性能、低功耗的车载信息娱乐系统SoC(System on Chip)平台。Renesas R-Car Gen2是该系列的第二代产品,它为汽车应用提供了强大的处理能力和丰富的接口选项,包括...

    瑞萨车载芯片R-Car家族的最新成员登场

    瑞萨电子株式会社,作为全球领先的半导体和解决方案提供商,推出了其R-Car系列的最新成员——R-Car E2车载系统芯片(SoC)。这款芯片专为入门级汽车集成驾驶舱系统设计,旨在提升驾驶体验,同时支持汽车与智能手机的...

    Ubuntu dev-sidecar deb安装包

    Ubuntu dev-sidecar deb安装包 DevSidecar-1.7.3.deb

    wait-side-car-源码.rar

    《wait-side-car源码解析》 在IT领域,理解源码是提升技术能力的重要途径。本文将深入探讨"wait-side-car"项目的源码,旨在帮助读者解析其内部机制,掌握核心概念和技术细节。 "wait-side-car"项目名称可能来源于...

Global site tag (gtag.js) - Google Analytics