hdoj 2680 Choose the best route【最短路 dijkstra && SPFA】

来源:互联网 发布:java前端面试 编辑:程序博客网 时间:2024/05/03 09:05

Choose the best route

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 11559    Accepted Submission(s): 3759



Problem Description
One 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 51 2 21 5 31 3 42 4 72 5 62 3 53 5 14 5 122 34 3 41 2 31 3 42 3 211
 

Sample Output
1-1
 

此题按题上说的来做的话容易超时,采取反向建图把唯一的终点当成起点~ 

dijkstra:

#include<cstdio>#include<cstring>#include<cmath>#include<queue>#define mem(a, b) memset(a, (b), sizeof(a))#define Wi(a) while(a--)#define Si(a) scanf("%d", &a)#define Pi(a) printf("%d\n", (a))#define INF 0x3f3f3f3f#include<algorithm>using namespace std;const int mx = 1010;int map[mx][mx], dis[mx], vis[mx];int n, m, t;void init(){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)map[i][j] = i==j?0:INF;}}void getmap(){int a, b, c;Wi(m){scanf("%d%d%d", &a, &b, &c);if(map[b][a] > c)map[b][a] = c;}}void dijkstra(int s){mem(vis, 0);int i, j, k;for(i = 1; i <= n; i++)   dis[i] = map[s][i];dis[s] = 0;vis[s] = 1;for(i = 1; i < n; i++){int minn = INF;for(j = 1; j <= n; j++){if(!vis[j] && dis[j] < minn){minn = dis[j];k = j;}}if(minn == INF)   break;vis[k] = 1;for(j = 1; j <= n; j++){if(!vis[j])dis[j] = min(dis[j], dis[k]+map[k][j]);}}} int main(){while(scanf("%d%d%d", &n, &m, &t)!=EOF){init();getmap();dijkstra(t);int ans = INF;int w, s;  Si(w);Wi(w){Si(s); if(ans > dis[s])ans = dis[s];}if(ans != INF)Pi(ans);elseprintf("-1\n");}return 0;}

floyd超时。。。。。

SPFA:

#include<cstdio>#include<cstring>#include<cmath>#include<queue>#define mem(a, b) memset(a, (b), sizeof(a))#define Wi(a) while(a--)#define Si(a) scanf("%d", &a)#define Pi(a) printf("%d\n", (a))#define INF 0x3f3f3f3f#include<algorithm>using namespace std;const int mx = 1010;int dis[mx], vis[mx];int n, m, t;int head[mx], edgenum;struct node{int from, to, val, next;}; node edge[220000];void init(){edgenum = 0;mem(head, -1);}void add(int a, int b, int c){node E = {a, b, c, head[a]};edge[edgenum] = E;head[a] = edgenum++;}void getmap(){int a, b, c;Wi(m){scanf("%d%d%d", &a, &b, &c);add(b, a, c);}}void spfa(int s){mem(vis, 0);   mem(dis, 0x3f);vis[s] = 1;dis[s] = 0;queue<int> q;q.push(s);while(!q.empty()){int u = q.front(); q.pop(); vis[u] = 0;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(dis[v] > dis[u]+edge[i].val){dis[v] = dis[u]+edge[i].val;if(!vis[v]){vis[v] = 1;q.push(v);}}}}}int main(){while(scanf("%d%d%d", &n,&m,&t)!=EOF){init();getmap();spfa(t);int ans = INF;int w;  Si(w);Wi(w){int s;  Si(s);if(ans > dis[s])ans = dis[s];}if(ans != INF)Pi(ans);elseprintf("-1\n");}return 0;}





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7岁儿童流清鼻涕怎么办 1岁的宝宝流鼻涕怎么办 3岁宝宝鼻塞严重怎么办 宝宝流鼻涕2个月怎么办 一个月宝宝流鼻子怎么办 六个月宝宝流清水鼻涕怎么办 婴儿流鼻涕怎么办最简单方法 婴儿咳嗽流鼻涕怎么办最简单方法 6个月小孩流鼻涕怎么办 宝宝风寒感冒咳嗽流鼻涕怎么办 三个月宝宝流清鼻涕怎么办 三个月宝宝留清鼻涕怎么办 三个月婴儿流清鼻涕怎么办 宝宝7个月流鼻涕怎么办 6个月孩子流鼻涕怎么办 十一个月孩子感冒流鼻涕怎么办 7个月孩子流鼻涕怎么办 18个月的宝宝流鼻涕怎么办 6个月宝宝咳嗽流鼻涕怎么办 18个月宝宝咳嗽流鼻涕怎么办 6个月宝宝流鼻涕打喷嚏怎么办 宝宝18个月流鼻涕怎么办 18个月宝宝感冒流鼻涕怎么办 小孩睡觉鼻子不通气怎么办 宝宝鼻子里有鼻涕出不来怎么办 孩子喉咙有痰呼呼响怎么办 六个月宝宝鼻塞怎么办速效办法 两个月小孩鼻子不通气怎么办 一岁宝宝流清鼻涕怎么办 孩子鼻子里有鼻涕怎么办 宝宝晚上睡觉鼻子不通气怎么办 宝宝感冒睡觉鼻子不通气怎么办 宝宝3个月流鼻涕怎么办 小孩吃着了发烧怎么办 半岁宝宝鼻子塞怎么办 宝宝伤风鼻子不通气怎么办 二十天的宝宝伤风鼻子不通怎么办 一个多月的宝宝鼻子有鼻屎怎么办 2个月宝宝鼻子里有鼻屎怎么办 四个月婴儿感冒发烧怎么办 一个月婴儿感冒发烧怎么办