hdoj 2680 Choose the best route
2015-08-18 20:36
375 查看
Choose the best route
Problem DescriptionOne day , Kiki wants to visit one of her friends. As she is liable to carsickness , she wants to arrive at her friend’s home as soon as possible . Now give you a map of the city’s traffic route, and the
stations which are near Kiki’s home so that she can take. You may suppose Kiki can change the bus at any station. Please find out the least time Kiki needs to spend. To make it easy, if the city have n bus stations ,the stations will been expressed as an integer
1,2,3…n.
Input
There are several test cases.
Each case begins with three integers n, m and s,(n<1000,m<20000,1=<s<=n) n stands for the number of bus stations in this city and m stands for the number of directed ways between bus stations .(Maybe there are several ways between two bus stations .) s stands
for the bus station that near Kiki’s friend’s home.
Then follow m lines ,each line contains three integers p , q , t (0<t<=1000). means from station p to station q there is a way and it will costs t minutes .
Then a line with an integer w(0<w<n), means the number of stations Kiki can take at the beginning. Then follows w integers stands for these stations.
Output
The output contains one line for each data set : the least time Kiki needs to spend ,if it’s impossible to find such a route ,just output “-1”.
Sample Input
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
Sample Output
1 -1
题目大意:
有一天,kiki想去她的一个朋友。 她很容易晕车,她想尽快到达朋友家。 现在给你一个城市的交通路线,和kiki的家附近的车站, 你可以设想Kiki可以在任何车站的改变公共汽车。 如果这座城市有n个车站,车站将被表示为一个整数1、2、3…n。请找出Kiki最少需要花费的时间?解题思路:
这道题有一定的技巧性,刚开始做的时候不知道怎么回事感觉自己做的没问题可是一直超时,把我真的是气坏了,太悲催了。后来百度了一下怎么解决超时的问题,可是还没有找到解决的方法,百度上只是说算法不够优化。可是我真的不知道该怎么优化。
后来同讲了以后才知道要从相反的反向考虑,即把终点当作起点,这样只进行了一个dijkstra降低了时间的复杂度,真的优化啦。
还要注意一点就是:
在给map数组赋值的话也需要反着赋值,原来的p-q,要改为q-p,这道题不能当做无向图要当做有向图处理,
虽然做这道题浪费了不少时间,但是从做题中也学到许多知识,虽然没做几道题,感觉还是有收获的。
#include<iostream> #include<cstdio> #define INF 0x3f3f3f3f #include<algorithm> const int maxn=1010; using namespace std; int d[maxn]; int used[maxn]; int map[maxn][maxn]; int n; void dijkstra(int s) { for(int i=1;i<=n;i++) { d[i]=INF; used[i]=0; } d[s]=0; while(1) { int v=-1; for(int i=1;i<=n;i++) if(!used[i]&&(v==-1||d[i]<d[v])) v=i; if(v==-1) break; used[v]=1; for(int i=1;i<=n;i++) d[i]=min(d[i],d[v]+map[v][i]); } } int main() { int m,s; while(scanf("%d%d%d",&n,&m,&s)!=EOF) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } int p,q,t,w,g; for(int i=0;i<m;i++) { scanf("%d%d%d",&p,&q,&t); if(map[q][p]>t) map[q][p]=t; } scanf("%d",&w); int minn=INF; dijkstra(s); while(w--) { scanf("%d",&g); minn=min(minn,d[g]); } if(minn>=INF) printf("-1\n"); else printf("%d\n",minn); } return 0; }
相关文章推荐
- HDU 5399 Too Simple (2015年多校比赛第9场)
- CSS画三角形集锦
- HDU5399——贪心——Too Simple
- UITableView
- HDU1845Jimmy’s Assignment(无向图,最大匹配)
- Mac自带Python版本升级
- 检查服务器的pid文件,如果文件不存在或pid对应的进程已死重启服务器
- EntityFramework之数据库以及表基本创建(一)
- Android 消息处理机制-Looper,Handler,MessageQueue
- python 使用pymsql连接数据库
- 数据挖掘之关联分析四(连续属性处理)
- C# WPF 动态添加窗体
- 判断一个单链表中是否存在环
- unix select函数读写队列注意事项
- <AndroidStudio每日一贴>1.快速打开方法或字段
- 全才学霸是怎样管理时间的?
- ASP.NET文件上传和下载
- SqlFunctions 可以在EF种调用sqlserver的函数
- 存在即更新反之插入的三种防唯一键冲突和死锁的写法
- Java删除ArrayList中的重复元素的2种方法