题目链接:http://acm.hdu.edu.cn/status.php?user=l1526789512&pid=2112&status=5
HDU Today
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22918 Accepted Submission(s): 5483
Problem Description
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
Sample Input
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
Sample Output
50
Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake
虽然偶尔会迷路,但是因为有了你的帮助
**和**从此还是过上了幸福的生活。
――全剧终――
思路:建图的时候略坑。建完图过后floyd和dijkstra。
建图使用stl中的map。
map<string,int> m;
m.clear(); //清空
可以有m[a]这种用法;
m.begin(); //返回该map中第一个元素的迭代器
m.end(); //返回该map中最后一个元素的迭代器
m.find(); //若找到返回给元素的迭代器,否则返回最后一个元素的迭代器
distance函数 //可通过两迭代器找下标
更多关于map的东西还需继续学习。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> using namespace std; #define INF 999999999 int mapp[200][200],flag; int dist[200]; int n; /* void floyd() { for(int k=0; k<flag; k++) for(int i=0; i<flag; i++) for(int j=0; j<flag; j++) if(mapp[i][j]>mapp[i][k]+mapp[k][j]) mapp[i][j]=mapp[i][k]+mapp[k][j]; } */ void Dijkstra(int v0) { int S[200]; for(int i=0; i<flag; i++) { dist[i]=mapp[v0][i]; S[i]=0; } dist[v0]=0; S[v0]=1; for(int j=1; j<flag;j++) { int flag1=0; int mindist=INF; for(int i=0; i<flag; i++) { if(!S[i]&&dist[i]<mindist) { mindist=dist[i]; flag1=i; } } S[flag1]=1; for(int i=0; i<flag;i++) { if(!S[i]&&mapp[flag1][i]<INF&&dist[i]>dist[flag1]+mapp[flag1][i]) dist[i]=dist[flag1]+mapp[flag1][i]; } } } int main() { char a[50],b[50]; int x,f; map<string ,int> m; while(scanf("%d",&n)!=EOF&&n!=-1) { f=0; m.clear(); scanf("%s%s",a,b); if(strcmp(a,b)==0) f=1; m[a]=0; m[b]=1; flag=2; for(int i=0; i<170; i++) { dist[i]=INF; for(int j=0; j<170; j++) { if(i==j) mapp[i][j]=0; else mapp[i][j]=INF; } } for(int i=0; i<n; i++) { scanf("%s%s%d",a,b,&x); //cout<<a<<b<<x<<"*"<<endl; if(m.find(a)==m.end()) m[a]=flag++; if(m.find(b)==m.end()) m[b]=flag++; if(x<mapp[m[a]][m[b]]) { mapp[m[a]][m[b]]=x; mapp[m[b]][m[a]]=x; } } if(f==1) { printf("0 "); continue; } Dijkstra(0); if(dist[1]==INF) printf("-1 "); else printf("%d ",dist[1]); } return 0; }