哈理工 oj 2122 旅行(map + 最短路dij算法)

时间:2023-11-23 08:40:08
旅行
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 18(6 users) Total Accepted: 3(3 users) Rating: 哈理工 oj 2122 旅行(map + 最短路dij算法)哈理工 oj 2122 旅行(map + 最短路dij算法)哈理工 oj 2122 旅行(map + 最短路dij算法)哈理工 oj 2122 旅行(map + 最短路dij算法) Special Judge: No
Description

“04.24,和Sakura去东京天空树,世界上最暖和的地方天空树的顶上。

“04.26。和Sakura去明治神宫。有人在那里举办婚礼。”

“04.25。和Sakura去迪士尼。鬼屋非常可怕。可是有Sakura在,所以不可怕。

“Sakura最好了。”

——江南
《龙族》

绘梨衣和路明非今天要从迪士尼前往天空树,但他们的钱不多了,所以能省则省,他们如今有一个地图上面有n个景点和m条景点之间的路,每条路坐车都须要一定的钱数,如今他们求助于你,请你帮他们计算下从当前地点到目的地最少须要的钱数。

Input

有多组数据,每组数据第一行有两个数字2<=n<=30000,1<=m<=30000。

接下来n行输入n个地名。

接下来m行每行有两个字符串(长度不超过20)和一个数字,代表两地之间的坐车的费用。

接下来一行输入两个字符串分别代表起点和终点。

Output

一个int数代表最少须要的钱数。

数据保证不会超过int型范围。

Sample Input
2 1

disney

TokyoSkyTree

disney TokyoSkyTree 1

disney TokyoSkyTree
Sample Output
1
Source

2014暑假集训练习赛(7月19日)

看到 理工题目上 这个题目做的人没几个  。就看看是什么玩意儿~!~

#include<iostream>
#include<sstream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<cctype>
#include<string>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int maxn=30003;
const int INF=0x1f1f1f1f;
int n,m;
//标记起始位置
string s;
string e;
map<string,int>cnt;//映射成节点编号 struct Edge
{
int from,to,dist;
Edge(int u,int v,int d):from(u),to(v),dist(d) {}
};
vector<Edge>edges;//存储边的结点信息
vector<int>G[maxn];//邻接表
bool done[maxn]; //标记是否訪问过
int d[maxn]; //距离数组
struct heapnode //用于优先队列自己定义
{
int d,u;
bool operator <(const heapnode rhs) const
{
return d > rhs.d;
}
heapnode(int dd,int uu):d(dd),u(uu) {}
}; void init()//初始化不可缺少
{
for(int i=0; i<n; i++)
G[i].clear();
edges.clear();
} void addedge(int from,int to,int dist)
{
edges.push_back(Edge(from,to,dist));
int m = edges.size();
G[from].push_back(m-1);
} void dij( int s)
{
priority_queue<heapnode>Q;
for(int i=0; i<=n; i++)//初始化距离数组
d[i]=INF;
d[s]=0;
memset(done ,0,sizeof(done));
Q.push( heapnode(0,s) );
while(!Q.empty())
{
heapnode x = Q.top();
Q.pop();
int u=x.u;
if(u==cnt[e])
{
printf("%d\n",x.d);
break;
}
if(done[u])continue;
done[u] = true;
for(int i=0; i<G[u].size(); i++)
{
Edge& e=edges[G[u][i]];//取出来一条邻接边
if(d[e.to]>d[u]+e.dist)
{
d[e.to] = d[u] + e.dist;
Q.push((heapnode(d[e.to],e.to)));
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int t=1;
int ans=0;
string str;
init();
for(int i=0; i<n; i++)
{
cin>>str;
cnt[str]=t++;
}
for(int i=0; i<m; i++)
{
string str2;
int x;
cin>>str>>str2>>x;
addedge(cnt[str],cnt[str2],x);
addedge(cnt[str2],cnt[str],x);
}
cin>>s>>e;
dij(cnt[s]);
s.clear();
e.clear();
cnt.clear();
}
return 0;
}
/*
2 1
a
v
a v 1
a v
3 2
a
b
c
a b 2
b c 3
a c
*/