UVA
来源:互联网 发布:网页js文件 编辑:程序博客网 时间:2024/06/02 06:23
给出每个点的经纬,和航线(有向边),求最短路
题意很简单,主要是距离的转化,先把经纬度转化成弧度数,然后转化出每个点的(x,y,z) 然后在球上求距离。
#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <cmath>#include <stack>#include <stdio.h>#include <string.h>#include <math.h>#include <iostream>#define INF 0x3f3f3f3fusing namespace std;int n, m,q ;const double PI = 3.141592653589793;const double r = 6378 ;const int maxn = 10000+10;struct Point{ double lt,ln; double ht,hn; string name; double x,y,z;} s[maxn];map<string,int>ma;int E;int g[200][200];int get_id(string s1){ if(ma[s1]) { return ma[s1]; } else { E++; ma[s1] = E; return E; }}int get_dis(int i,int j){ double l = acos((s[i].x * s[j].x + s[i].y * s[j].y + s[i].z * s[j].z ) / (r*r)); l = round(l * r); return l;}void get_pos(int i){ double l = r * cos(s[i].ht); s[i].x = l * cos(s[i].hn); s[i].z = r * sin(s[i].ht); s[i].y = l * sin(s[i].hn);// cout << "*******" << endl;// printf("%lf %lf %dlf\n",s[i].x,s[i].y,s[i].z);// cout << "*******" << endl;}void floyd(){ for(int k = 1 ; k <= E ; k++) { for(int i = 1 ; i <= E ; i++) { for(int j = 1 ; j <= E ; j++) { if(g[k][j] != INF && g[i][k] != INF) g[i][j] = min(g[i][j],g[i][k] + g[k][j]); } } }}int main(){ int kase = 1; while(cin >> n >> m >> q && (n||m||q)) { E = 0; ma.clear(); memset(g,0,sizeof(g)); for(int i = 0 ; i < n ; i++) { cin >> s[i].name; scanf("%lf%lf",&s[i].lt,&s[i].ln); s[i].ht = s[i].lt * PI / 180; s[i].hn = s[i].ln * PI / 180; get_pos(i); } for(int i = 0 ; i <= n ; i++) { for(int j = 0 ; j <= n ; j++) { if(i!=j) { g[i][j] = INF; } } }// for(int i = 0 ; i < n ; i++)// {// for(int j = 0 ; j < n ;j++)// {//// int from =// if(i!=j)// {// g[get_id(s[i].name)][get_id(s[j].name)] = get_dis(i,j);// }// }// } string s1,s2; for(int i = 0 ; i< m ; i++) { cin >> s1 >> s2; int x1 = get_id(s1); int x2 = get_id(s2); bool flag = false; for(int j = 0; j < n ; j++) { for(int k = 0 ; k < n ; k++) { if(s[j].name == s1 && s[k].name == s2) { g[x1][x2] = get_dis(j,k);// cout << "get:" << get_dis(j,k) << endl; flag=true; break; } } if(flag) break; } } floyd();// cout << "E : " << endl;// for(int k = 1 ; k <= E ; k++)// {// for(int i = 1 ; i <= E ; i++)// {// g[i][j] = min(g[i][j],g[i][k] + g[k][j]);// }// }// } if(kase > 1) cout <<endl; printf("Case #%d\n",kase++); for(int i = 0 ; i< q ; i++) { cin >> s1 >> s2; int x1 = get_id(s1); int x2 = get_id(s2);// cout << "xxxx" << x1 << " " << x2 << endl;// for(int k = 1 ; k <= E ; k++)// {// for(int i = 1 ; i <= E ; i++)// {// if(g[x1][x2] != INF) { printf("%d km\n",g[x1][x2]); } else { printf("no route exists\n"); } }// if() } return 0;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- win10 1703配置java环境变量,解决javac不是内部或外部命令等问题
- Java 集合深入理解(16):HashMap 主要特点和关键方法源码解读
- oracle 关于SYS_CONNECT_BY_PATH函数用法
- C++学习笔记之零碎知识点(三)
- 一个几何问题和猜测
- UVA
- Java 集合深入理解(17):HashMap 在 JDK 1.8 后新增的红黑树结构
- IT公司从1亿美元电子邮件诈骗案中深受启发
- Linux下I2C驱动框架全面解析
- Linux网络编程:socket文件传输范例
- 分页对象
- [Usaco2006 Nov]Roadblocks 次短路
- android audio混音
- Adobe Photoshop CC 2017 破解激活教程