NOJ1049飞机最少换乘次数问题——BFS

这是一个关于使用宽度优先遍历(BFS)解决飞机从起点城市到其他城市最少换乘次数的问题。题目描述了输入包括城市数、航线数和起点城市,以及如何输出最少换乘次数。示例输入和输出展示了具体操作,并强调了单向航线的特点以及处理不能抵达的情况。

飞机最少换乘次数问题

Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte
Total Submit:379            Accepted:157

Description

设有n个城市,编号为0n-1m条单向航线的起点和终点由输入提供,寻找一条换乘次数最少的线路方案。

Input

第一行为三个整数n

### 关于西北工业大学NOJ平台第100题——飞机起飞问题 #### 问题描述 在一个模拟飞行环境中,给定一系列机场的位置坐标以及每架飞机的最大飞行距离。对于每一架飞机,计算能够到达的目的地数量。假设地球是一个完美的球体,并且忽略风速和其他外部因素的影响。 此题目旨在考察选手对地理信息系统(GIS)的理解程度以及处理实际应用中的几何运算能力[^1]。 #### 解决方案概述 为了高效解决这个问题,可以采用如下方法: - **预处理阶段**:读取所有机场的数据并存储其经纬度信息;初始化一个数组用于记录各个机场之间的最短路径长度。 - **核心算法实现**: - 使用Haversine公式来精确测量两个地理位置间的直线距离。 - 对于每一个起点机场,遍历其他所有的终点机场,判断当前飞机能否直飞至该目的地(即两者间距离不超过最大飞行范围)。如果能,则计数器加一。 最后输出每个起始位置对应的可抵达地点数目作为最终结果。 ```cpp #include <iostream> #include <vector> #include <cmath> using namespace std; const double EARTH_RADIUS = 6378.137; // 地球半径单位为公里 // 计算两点之间大圆距离 double getDistance(double lat1, double lng1, double lat2, double lng2){ double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * asin(sqrt(pow(sin(a/2),2)+cos(radLat1)*cos(radLat2)*pow(sin(b/2),2))); s = s*EARTH_RADIUS; return s; } int main(){ vector<pair<double,double>> airports; // 存储各机场经度纬度 // 假设已经获取到airports数据... int m; cin >> m; // 输入m表示有m架飞机 while(m--){ double max_distance; cin >> max_distance; // 每次输入一架飞机的最大飞行距离 int reachable_count = 0; for(int i=0 ;i<airports.size(); ++i){ // 枚举出发点 bool can_reach=false; for(int j=0 ;j<airports.size(); ++j){ // 枚举目的地点 if(i==j || getDistance(airports[i].first,airports[i].second, airports[j].first,airports[j].second)>max_distance) continue; can_reach=true;break; } if(can_reach) reachable_count++; } cout << reachable_count << endl; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值