NBOJv2——Problem 1037: Wormhole(map邻接表+优先队列SPFA)
Problem 1037: Wormhole
Time Limits: 5000 MS Memory Limits: 200000 KB
64-bit interger IO format: %lld Java class name: Main
Description

With our time on Earth coming to an end, Cooper and Amelia have volunteered to under- take what could be the most important mission in human history: travelling beyond this galaxy to discover whether mankind has
a future among the stars. Fortunately, astronomers have iden- tified several potentially inhabitable planets and have also discovered that some of these planets have wormholes joining them, which effectively makes the travel distance between these wormhole
connected planets zero. For all other planets, the travel distance between them is simply the Eu- clidean distance between the planets. Given the location of Earth, planets, and wormholes, find the shortest travel distance between any pairs of planets.
Input
The first line of input is a single integer, T (1 ≤ T ≤ 10) the number of test cases.
Each test case consists of planets, wormholes, and a set of distance queries.
The planets list for a test case starts with a single integer, p (1 ≤ p ≤ 60), the number of planets. Following this are p lines, where each line contains a planet name along with the planet’s integer coordinates,
i.e. name x y z (0 ≤ x, y, x ≤ 2 · 106) The names of the planets will consist only of ASCII letters and numbers, and will always start with an ASCII letter. Planet names are case-sensitive (Earth and earth are distinct planets). The length of a planet name
will never be greater than 50 characters. All coordinates are given in parsecs.The wormholes list for a test case starts with a single integer, w (0 ≤ w ≤ 40), the number of wormholes, followed by the list of w wormholes. Each wormhole consists of two planet names separated by a space. The
first planet name marks the entrance of wormhole, and the second planet name marks the exit from the wormhole. The planets that mark wormholes will be chosen from the list of planets given in the preceding section. Note: you can’t enter a wormhole at its exit.The queries list for a test case starts with a single integer, q (1 ≤ q ≤ 20), the number of queries. Each query consists of two planet names separated by a space. Both planets will have been listed in the planet
list.
Output
For each test case, output a line, “Case i:”, the number of the ith test case. Then, for each query in that test case, output a line that states “The distance from planet1 to planet2 is d parsecs.”, where the planets
are the names from the query and d is the shortest possible travel distance between the two planets. Round d to the nearest integer.
Sample Input
Output for Sample Input
Case 1:
The distance from Earth to Proxima is 5 parsecs.
The distance from Earth to Barnards is 0 parsecs.
The distance from Earth to Sirius is 0 parsecs.
The distance from Proxima to Earth is 5 parsecs.
The distance from Barnards to Earth is 5 parsecs.
The distance from Sirius to Earth is 5 parsecs.
Case 2:
The distance from z2 to z1 is 17 parsecs.
The distance from z1 to z2 is 0 parsecs.
The distance from z1 to z3 is 10 parsecs.
Case 3:
The distance from Mars to Jupiter is 89894 parsecs.
Hint
3
4
Earth 0 0 0
Proxima 5 0 0
Barnards 5 5 0
Sirius 0 5 0
2
Earth Barnards
Barnards Sirius
6
Earth Proxima
Earth Barnards
Earth Sirius
Proxima Earth
Barnards Earth
Sirius Earth
3
z1 0 0 0
z2 10 10 10
z3 10 0 0
1
z1 z2
3
z2 z1
z1 z2
z1 z3
2
Mars 12345 98765 87654
Jupiter 45678 65432 11111
0
1
Mars Jupiter
懒人用map写邻接表,果然够麻烦的,神奇的是写完可以直接编译,居然没报错,懂套路就是一SPFA水题。只是点从int换成了string。
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
map<string,vector<pair<string,double> > >E;
map<string,double>d;
map<string,double>::iterator mit;
struct info
{
string s;
double x,y,z;
};
double dx(const info &a,const info &b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
void spfa(const string &s,const string &t)
{
d[s]=0;
priority_queue<pair<double,string> >Q;
vector<pair<string,double> >::iterator it;
Q.push(pair<double,string>(-d[s],s));
while (!Q.empty())
{
string now=Q.top().second;
Q.pop();
for (it=E[now].begin(); it!=E[now].end(); it++)
{
string v=it->first;
if(d[v]>d[now]+it->second)
{
d[v]=d[now]+it->second;
Q.push(pair<double,string>(-d[v],v));
}
}
}
return ;
}
int main(void)
{
int tcase,i,j;
info pla[70];
cin>>tcase;
map<string,vector<pair<string,double> > >::iterator it;
for (int ca=1; ca<=tcase; ca++)
{
E.clear();
d.clear();
int p,q;
string s;
double x,y,z;
cin>>p;
for (i=0; i<p; i++)
{
cin>>pla[i].s>>pla[i].x>>pla[i].y>>pla[i].z;
}
for (i=0; i<p; i++)
{
d[pla[i].s]=1e9;
for (j=i+1; j<p; j++)
{
E[pla[i].s].push_back(pair<string,double>(pla[j].s,dx(pla[i],pla[j])));
E[pla[j].s].push_back(pair<string,double>(pla[i].s,dx(pla[i],pla[j])));
d[pla[j].s]=1e9;
}
}
string t;
int w;
vector<pair<string,double> >::iterator it;
cin>>w;
while (w--)
{
cin>>s>>t;
for (it=E[s].begin(); it!=E[s].end(); it++)
{
if(it->first==t)
it->second=0;
}
}
cin>>q;
cout<<"Case "<<ca<<":"<<endl;
while (q--)
{
cin>>s>>t;
for (mit=d.begin(); mit!=d.end(); mit++)
mit->second=1e9;
spfa(s,t);
printf("The distance from %s to %s is %.0lf parsecs.\n",s.c_str(),t.c_str(),d[t]);
}
}
return 0;
}
NBOJv2——Problem 1037: Wormhole(map邻接表+优先队列SPFA)的更多相关文章
- 确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)
确定比赛名次 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...
- poj3013 邻接表+优先队列+Dij
把我坑到死的题 开始开题以为是全图连通是的最小值 ,以为是最小生成树,然后敲了发现不是,看了下别人的题意,然后懂了: 然后发现数据大,要用邻接表就去学了一下邻接表,然后又去学了下优先队列优化的dij: ...
- Head of a Gang (map+邻接表+DFS)
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...
- Genealogical tree(拓扑结构+邻接表+优先队列)
Genealogical tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) ...
- HDU 2544 最短路(邻接表+优先队列+dijstra优化模版)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Prime邻接表+优先队列
#include <iostream> #include <cmath> #include <cstring> #include <cstdlib> # ...
- POJ 3259 Wormholes 邻接表的SPFA判断负权回路
http://poj.org/problem?id=3259 题目大意: 一个农民有农场,上面有一些虫洞和路,走虫洞可以回到 T秒前,而路就和平常的一样啦,需要花费时间走过.问该农民可不可能从某个点出 ...
- 基于STL优先队列和邻接表的dijkstra算法
首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...
随机推荐
- Java 设计模式之中介者模式
本文继续23种设计模式系列之中介者模式. 定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 角色 抽象中介者: ...
- HTML5中的webSocket、ajax、http
本文原链接:https://cloud.tencent.com/developer/article/1115496 https://cloud.tencent.com/developer/articl ...
- 怎么在WEBSTORM中设置代码模板 Live Templates
怎么在WEBSTORM中设置代码模板 Live Templates setting 里面 https://www.cnblogs.com/xinzaimengzai/p/9938464.html
- 2018.4.11 Java为何用xml做配置文件? 理由如下
在Java世界里xml配置文件几乎是首选,xml有什么好的特性呢? 第一:xml能存储小量数据,仅仅是存储数据. 第二:xml可以跨平台,主流各种平台都对xml有支持, 真正的跨平台, 第三:xml读 ...
- Hicharts图表的使用
Hicharts图表的使用 引用 在4.0之后就不需要jQuery了,z这里是用ajax向后台发送数据 引入js或者CDN,这里采用的是引入js的方式 在Hicarts文件中的index中查看相应的图 ...
- nodejs安装遇到npm命令无法使用问题
解决方法: 在用户文件夹中建立npm文件夹就可以使用了. 再使用npm命令就可以了.
- 响应者链和Hit-Test 机制
概念: 响应者 : 对用户交互动作事件进行响应的对象.响应者链:成为处理事件的响应者的先后顺序链. 1.Hit-Test 机制 当用户触摸(Touch)屏幕进行交互时,系统首先要找到响应者(Respo ...
- NOIP模拟赛 篮球比赛2
篮球比赛2(basketball2.*) 由于Czhou举行了众多noip模拟赛,也导致放学后篮球比赛次数急剧增加.神牛们身体素质突飞猛进,并且球技不断精进.这引起了体育老师彩哥的注意,为了给校篮球队 ...
- CF-1114 (2019/02/11)
CF-1114 A. Got Any Grapes? skip B. Yet Another Array Partitioning Task 将n个数分成连续的k组,使得每组的前m大的数字的总和最大. ...
- 【dsu || 线段树合并】bzoj4756: [Usaco2017 Jan]Promotion Counting
调半天原来是dsu写不熟 Description The cows have once again tried to form a startup company, failing to rememb ...