您的位置:首页 > 其它

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
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 21
Sample 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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: