FZU - 2209 老S的旅行计划(最短路spfa)
2018-03-28 11:08
357 查看
老S在某城市生活的非常不自在,想趁着ICPC举办期间在省内转转。已知老S所在的省有N个城市,M条无向边(对于某一对结点可能出现重边)。由于省内的交通相当糟糕,通过某条边所需要花费的时间受到一天中不同时刻的影响。此外对于某一时刻(一天24小时的任意一个整点算一个时刻),从任何方向通过无向边所需要的时间相同。现在老S想请你帮他规划一下旅行路线。
Input
第一行输入为一个整数T表示测试个数T
对于每一个测试的第一行为3个整数N,M,K,其中K表示老S的询问数
之后有2M行,一组2行共M组。每组第一行是两个整数x,y表示第x个城市与第y个城市之间有一条无向边。
每组第二行有24个整数cost[i](0<=i<=23)表示在第i个时刻通过这条无向边需要消耗的时间(单位为小时)。并且保证cost[i]<=coust[i+1]+1(0<=i<=22)且cost[23]<=cost[0]+1。
之后有K每行有两个整数D和S表示询问,从1号城市的第S个时刻出发,最终目的地为城市D所需要最少几个小时,此外如果老S不能到达目标城市则输出-1。
Limit:
1 <=x, y<=N.
1 <=all Cost values<=50.
1 <=D<=N.
0 <=S<=23.
1 <=T<=100.
2 <=N<= 20.
1 <=M<=100.
1 <=K<= 100.
Output对于任意一个样例输出仅有一行包括"Case #x: "其中x表示第x个样例,之后有K个整数用空格分隔开,分别表示老S的K个询问的答案。
Sample Input
Input
第一行输入为一个整数T表示测试个数T
对于每一个测试的第一行为3个整数N,M,K,其中K表示老S的询问数
之后有2M行,一组2行共M组。每组第一行是两个整数x,y表示第x个城市与第y个城市之间有一条无向边。
每组第二行有24个整数cost[i](0<=i<=23)表示在第i个时刻通过这条无向边需要消耗的时间(单位为小时)。并且保证cost[i]<=coust[i+1]+1(0<=i<=22)且cost[23]<=cost[0]+1。
之后有K每行有两个整数D和S表示询问,从1号城市的第S个时刻出发,最终目的地为城市D所需要最少几个小时,此外如果老S不能到达目标城市则输出-1。
Limit:
1 <=x, y<=N.
1 <=all Cost values<=50.
1 <=D<=N.
0 <=S<=23.
1 <=T<=100.
2 <=N<= 20.
1 <=M<=100.
1 <=K<= 100.
Output对于任意一个样例输出仅有一行包括"Case #x: "其中x表示第x个样例,之后有K个整数用空格分隔开,分别表示老S的K个询问的答案。
Sample Input
3 3 3 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 3 3 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 4 3 3 3 1 2 7 23 23 25 26 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 1 3 10 11 15 26 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 2 3 7 29 28 27 26 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 2 14 3 3 3 21Sample Output
Case #1: 1 2 Case #2: 1 -1 Case #3: 17 26 13
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> #include <queue> using namespace std; #define inf 0x3f3f3f3f int d[110],vis[110],ans[110]; int cost[110][110][30]; int t,n,m,k,x,y,s,kk; int spfa(int tt) { queue<int>q; memset(d,inf,sizeof(d)); memset(vis,0,sizeof(vis)); d[1]=0; q.push(1); vis[1]=1; while(!q.empty()) { int p=q.front(); q.pop(); vis[p]=0; for(int i=1;i<=n;i++) { if(d[i]>d[p]+cost[p][i][(s+d[p])%24]) { d[i]=d[p]+cost[p][i][(s+d[p])%24]; if(!vis[i]) { q.push(i); vis[i]=1; } } } } return d[tt]; } int main() { scanf("%d",&t); int yy=0; while(t--) { yy++; memset(cost,inf,sizeof(cost)); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); for(int j=0;j<24;j++) { scanf("%d",&kk); if(kk<cost[x][y][j]) cost[x][y][j]=cost[y][x][j]=kk; } } for(int i=1;i<=k;i++) { scanf("%d%d",&x,&s); int u=spfa(x); if(u==inf) ans[i]=-1; else ans[i]=u; } printf("Case #%d:",yy); for(int i=1;i<=k;i++) printf(" %d",ans[i]); printf("\n"); } }
相关文章推荐
- ACM 2. 旅行计划(水最短路)
- FZU2261 浪里个浪(最短路,spfa)(福州大学第十四届程序设计竞赛)
- hdu-2066 一个人的旅行(最短路spfa)
- 【最短路--思维】hdu2066 一个人的旅行、fzu2261 浪里个浪
- HDU 2066 一个人的旅行【最短路 dijkstra & floyed & SPFA 】
- hdu2066一个人的旅行【最短路dijkstra&&SPFA】
- HDU 2066 一个人的旅行(单源最短路SPFA)
- HDOJ 2066 一个人的旅行 (最短路 Dijkstra && SPFA)
- HDOJ 2066 一个人的旅行(最短路之SPFA)
- 【HDU - 2066 一个人的旅行】 最短路 dijkstra,spfa
- 【洛谷 P1137】旅行计划——spfa拓展
- Fzu月赛11 老S的旅行计划 dij
- hdu 2066 一个人的旅行(最短路+SPFA)
- fzu-2261(spfa打印最短路径,求最短路)
- hdu 2066 一个人的旅行 最短路spfa
- poj Wormholes (最短路 spfa Bellman-Ford 算法 邻接表实现)
- K短路问题模板(spfa+A*)
- AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】
- poj1613Cave Raider(带限制的最短路+spfa)
- 人活着系列之芳姐和芳姐的猪(最短路_SPFA+前向星)