航线算球面距离,需要经纬度转空间坐标。

任意两点间距离用Floyd求出来,查询时直接查表。

 #include <cstdio>
#include <map>
#include <cmath>
#include <string>
#include <cstring>
#include <cstdlib> using namespace std; const int MAXN = ;
const double INF = 1e30;
const double eps = 1e-;
const double PI = acos( -1.0 ); struct Point
{
double x, y;
Point( int x = , int y = ): x(x), y(y) {}
}; struct Coordinate //空间坐标
{
double x, y, z;
}; double dist[MAXN][MAXN];
Coordinate C[MAXN]; double Cha( double a, double b )
{
return (a - b)*(a - b);
} double GetDis( Coordinate a, Coordinate b ) //三维空间直线距离
{
return sqrt( Cha( a.x, b.x ) + Cha( a.y, b.y ) + Cha( a.z, b.z ) );
} double toRad( double deg ) //角度转弧度
{
return deg / 180.0 * acos( -1.0 );
} void get_coord( double R, double lat, double lng, double &x, double &y, double &z ) //经纬度转空间坐标
{
lat = toRad(lat);
lng = toRad(lng);
x = R*cos(lat)*cos(lng);
y = R*cos(lat)*sin(lng);
z = R*sin(lat);
return;
} void Floyd( int n ) //弗洛伊德算任意两点最短路
{
for ( int k = ; k < n; ++k )
for ( int i = ; i < n; ++i )
for ( int j = ; j < n; ++j )
{
double temp = dist[i][k] + dist[k][j];
if ( temp < dist[i][j] ) dist[i][j] = temp;
}
return;
} int main()
{
int n, m, Q;
double r = ;
int cas = ;
bool flag = false;
while ( scanf( "%d%d%d", &n, &m, &Q ), n || m || Q )
{
map<string, int> Map;
for ( int i = ; i < n; ++i )
{
char str[];
Point P;
scanf("%s%lf%lf", str, &P.x, &P.y );
get_coord( r, P.x, P.y, C[i].x, C[i].y, C[i].z );
Map[ str ] = i;
} for ( int i = ; i <= n; ++i )
for ( int j = ; j <= n; ++j )
dist[i][j] = INF; for ( int i = ; i < m; ++i )
{
char str1[], str2[];
scanf( "%s%s", str1, str2 );
int u = Map[ str1 ];
int v = Map[ str2 ];
dist[u][v] = (int)( 2.0 * asin( GetDis( C[u], C[v] ) / ( 2.0 * r ) ) * r + 0.5 ); //四舍五入
} Floyd( n ); if ( flag ) puts(""); printf( "Case #%d\n", ++cas ); while ( Q-- )
{
char str1[], str2[];
scanf( "%s%s", str1, str2 );
int u = Map[ str1 ];
int v = Map[ str2 ];
if ( dist[u][v] >= INF - eps ) puts( "no route exists" );
else printf( "%.0f km\n", dist[u][v] );
} flag = true;
}
return ;
}

UVa 10075 - Airlines的更多相关文章

  1. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  2. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  3. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  4. UVA 590 二十一 Always on the run

     Always on the run Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  5. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  6. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  7. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  8. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  9. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

随机推荐

  1. WPF-控件-ControlTemplate生成的控件

    <Window x:Class="由ControlTemplate生成的控件.MainWindow" xmlns="http://schemas.microsoft ...

  2. C#模拟键盘鼠标事件 SendKeys 的特殊键代码表(转)

    使用 SendKeys 将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用 Send.若要等待键击启动的任何进程,请使用 SendWait. 每个键都 ...

  3. (C学习基础)一,CMD的使用

    以后考研要考数据结构,所以系统的整理一下C学习笔记.这里开发用VS2013  CMD资料在这里下载 首先就是DOS系统的CMD的使用,是不是觉得会命令行语句的人特别牛呢,有时候使用命令行总是事半功倍, ...

  4. How to: Add Missing ContentPlaceHolder

    In Microsoft SharePoint Server 2010, the BlueBand master page is not supported in the Search Center ...

  5. [转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测

    Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较. 图像的边缘检测的原理是检测出图像中所有灰度值变化较大 ...

  6. C#异常类总结

    http://msdn.microsoft.com/zh-cn/library/aa664610(v=vs.71).aspx C#异常类相关总结 C#异常类一.基类Exception C#异常类二.常 ...

  7. Java多线程——<二>将任务交给线程,线程声明及启动

    一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...

  8. 你真的知道css三种存在样式(外联样式、内部样式、内联样式)的区别吗?

    css样式在html中有三种存在形态: 内联样式:<div style="display: none"></div> 内部样式: <style> ...

  9. [转载]数据库存储图片(MSSQL/ORACLE/ACCESS

    下面我来汇总一下如何将图片保存到SqlServer.Oracle.Access数据库中.首先,我们要明白图片是以二进制的形式保存在数据库中的,那么把图片保存到数据库中的步骤大体上有这几步1.将图片转换 ...

  10. KASS分布式文件系统(Kass File System)

    KASS分布式文件系统(Kass File System),简称KFS,是开始公司自主研发的分布式文件存储服务平台.KFS系统架构及功能服务类似Hadoop/GFS/DFS,它通过HTTP-WEB为上 ...