HDU——2112HDU Today(SPFA+简单Hash或map+前向星)
HDU Today
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23854 Accepted Submission(s): 5743
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake
虽然偶尔会迷路,但是因为有了你的帮助
**和**从此还是过上了幸福的生活。
――全剧终――
这道题让我知道了hash选取函数的重要性,用普通SPFApop之后要让vis[now]=0(强行WA11次)。
对于这样的更贴近生活的地名最短路问题,有两种做法,一种是用hash把字符串hash成一个特定的值,然后spfa,另一种是给字符串标号,用map是因为只标第一次出现的名字。hash是我自己想的,WA0x3ffffffff次,最后不知道是种子运气选的刚好还是把vis[now]加上的缘故,出现了久违的AC;后者是hashWA半天看别人博客看来的,效率前者780+ms后者1700+ms,前者麻烦后者简单。具体自己看吧。
hash方法代码:
#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))
#define MMINF(x) memset(x,INF,sizeof(x))
using namespace std;
typedef long long LL;
const int N=20100;
struct info
{
int to;
int dx;
int pre;
}E[N];
int head[N],d[N],cnt;
char s[35],t[35],x[35],y[35];
inline void add(const int &s,const int &t,const int &dis)
{
E[cnt].to=t;
E[cnt].dx=dis;
E[cnt].pre=head[s];
head[s]=cnt++;
}
inline int hash_fun(char s[])
{
int r=0,len=strlen(s);
for (int i=0; i<len; i++)
{
r=r*17+s[i];
r%=20023;
}
return r%20023;
}
inline void init()
{
memset(head,-1,sizeof(head));
MMINF(d);
cnt=0;
}
inline void spfa(int s)
{
typedef pair<int,int> pii;
priority_queue<pii>Q;
d[s]=0;
Q.push(pii(-d[s],s));
while (!Q.empty())
{
int now=Q.top().second;
Q.pop();
for (int i=head[now]; i!=-1; i=E[i].pre)
{
int v=E[i].to;
int w=E[i].dx;
if(d[v]>d[now]+w)
{
d[v]=d[now]+w;
Q.push(pii(-d[v],v));
}
}
}
}
int main(void)
{
int n,i,z;
while (~scanf("%d",&n)&&n!=-1)
{
init();
scanf("%s%s",s,t);
int sta=hash_fun(s),des=hash_fun(t);
for (i=0; i<n; i++)
{
scanf("%s %s %d",x,y,&z);
int S=hash_fun(x),T=hash_fun(y);
add(S,T,z);
add(T,S,z);
}
spfa(sta);
d[des]==INF?puts("-1"):printf("%d\n",d[des]);
}
return 0;
}
map标号法:
#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))
#define MMINF(x) memset(x,INF,sizeof(x))
using namespace std;
typedef long long LL;
const int N=20100;
struct info
{
int to;
int dx;
int pre;
}E[N];
int head[N],d[N],cnt;
char s[50],t[50],x[50],y[50];
void add(int s,int t,int dis)
{
E[cnt].to=t;
E[cnt].dx=dis;
E[cnt].pre=head[s];
head[s]=cnt++;
}
void init()
{
memset(head,-1,sizeof(head));
memset(d,INF,sizeof(d));
cnt=0;
MM(E);
}
void spfa(int s)
{
typedef pair<int,int> pii;
priority_queue<pair<int,int> >Q;
d[s]=0;
Q.push(pii(-d[s],s));
while (!Q.empty())
{
int now=Q.top().second;
Q.pop();
for (int i=head[now]; i!=-1; i=E[i].pre)
{
int v=E[i].to;
int w=E[i].dx;
if(d[v]>d[now]+w)
{
d[v]=d[now]+w;
Q.push(pii(-d[v],v));
}
}
}
}
int main(void)
{
int n,i,j,z,cnt_e;
while (~scanf("%d",&n)&&n!=-1)
{
init();
cnt_e=0;
map<string,int>pos;
scanf("%s%s",s,t);
pos[s]=++cnt_e;
if(pos[t]==0)
pos[t]=++cnt_e;
for (i=0; i<n; i++)
{
scanf("%s%s%d",x,y,&z);
if(pos[x]==0)
pos[x]=++cnt_e;
if(pos[y]==0)
pos[y]=++cnt_e; add(pos[x],pos[y],z);
add(pos[y],pos[x],z);
}
spfa(pos[s]);
if(d[pos[t]]==INF)
puts("-1");
else
printf("%d\n",d[pos[t]]);
}
return 0;
}
HDU——2112HDU Today(SPFA+简单Hash或map+前向星)的更多相关文章
- HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】
最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- Hash与Map
Hash与Map 面试时经常被问到,什么是Hash?什么是Map? 答:hash采用hash表存储,map一般采用红黑树(RB Tree)实现.因此其memory数据结构是不一样的,而且他们的时间复杂 ...
- hdu What Are You Talking About(map)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map简单应用 代码: #include <stdio.h> #include &l ...
- POJ 3320 尺取法,Hash,map标记
1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...
- HDOJ-ACM1425 sort 简单hash应用
其实快排也可以通过这个问题~不是考点 没想到考点是这个,简单hash应用,空间换时间 初始化一个长度为1000001的数组(由于数字的范围为[-500000,500000]) 如果存在这个数m,数组下 ...
- HDU 1535 SPFA 前向星存图优化
Invitation Cards Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU - 1535 Invitation Cards 前向星SPFA
Invitation Cards In the age of television, not many people attend theater performances. Antique Come ...
- POJ——1364King(差分约束SPFA判负环+前向星)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11946 Accepted: 4365 Description ...
随机推荐
- log explorer使用的几个问题[转载]
1)对数据库做了完全 差异 和日志备份备份时选用了删除事务日志中不活动的条目再用Log explorer打试图看日志时提示No log recorders found that match the f ...
- Selenium私房菜系列6 -- 深入了解Selenium RC工作原理(1)
前一篇已经比较详细讲述了如何使用Selenium RC进行Web测试,但到底Selenium RC是什么?或者它由哪几部分组成呢?? 一.Selenium RC的组成: 关于这个问题,我拿了官网上的一 ...
- jmeter中文件上传配置
- leetcode 4.两个排序数组的中位数
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums ...
- cannot load such file -- bundler/setup解决
sudo gem install bundler bundle update celluloid
- codeforces Gym 100338C Important Roads (重建最短路图)
正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图.然后求割边.注意重边,和卡spfa. 正权,好好的dijkstra不用,用什么spfa? #include<bits/st ...
- SayLove微信小程序
目录 SayLove 表白墙微信小程序 程序结构 说明 程序效果图 配置过程 结语 云开发 quickstart 参考文档 SayLove 表白墙微信小程序 项目地址:https://github.c ...
- k sum(lintcode)
没通过的代码: class Solution { public: /* * @param A: An integer array * @param k: A positive integer (k & ...
- python之数据类型补充
1. capitalize (首字母大写) 例题: s = "alex wusir" s1 = s.capitalize() # 格式 print(s1) ''' 输出结果 Ale ...
- PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)
PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20) http://www.patest.cn/contests/pat-b-practise/1027 本题 ...