最短路径
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
为了准备一年一度的校赛,大家都在忙着往赛场搬运东西,比如气球什么的。这时 YY 也没有闲着,他也加入了搬运工的行列。已知学校有 N 个路口和 M 条路,YY 并不是把东西直接搬到赛场,而是从 S 路口搬运到 T 路口。由于 YY 非常懒而且他有轻度强迫症。所以他要走的路需要尽可能的短,并且走过路径的数目要为 X 的倍数。
Input
输入的第一行为一个正整数T(1 ≤ T ≤ 20),代表测试数据组数。
对于每组测试数据:
输入的第一行为两个正整数 N 和 M(1 ≤ N ≤ 100, 1 ≤ M ≤ 10000)。
接下来M行每行三个正整数 U、V、W(0 ≤ U, V < N, 0 ≤ W ≤ 230 ),代表有一条从U到V的长度为W的有向路径。
最后一行为三个正整数S、T 、X(0 ≤ S, T < N, 1 ≤ X ≤ 10)。
Output
对于每组测试数据,输出满足条件的从 S 到 T 的最短路径。如果从 S 到 T 不可达,或者无法满足路径数是 X 的倍数,输出“No Answer!”(不包含引号)。
注意:64-bit 整型请使用 long long 来定义,并且使用 %lld 或 cin、cout 来输入输出,请不要使用 __int64 和 %I64d。
Example Input
2
2 1
0 1 1
0 1 2
3 2
0 1 1
1 2 1
0 2 2
Example Output
No Answer!
2
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const long long INF = 9999999999999999;
typedef struct node//前向星,存储方式
{
int to, next;
long long w;
}ST;
ST map[20000];
int head[105];
int vis[105];
int a[105], left, right;//数组模拟队列
long long dist[105][15];//本题要满足, 走过的路径数目要为x的倍数,所以开一个二维数组,多储存一下路径数目
void spfa(int s, int e, int x, int n)
{
int i, j, u;
for(i = 0; i <= n; i++)
{
vis[i] = 0;
for(j = 0; j <= x; j++)
dist[i][j] = INF;//j代表路径数目,全都初始化为无穷大
}
dist[s][0] = 0;//一开始路径数目为0,自己到自己,初始化为0
vis[s] = 1;//标记一下
a[right++ % 105] = s;//入列
while(left < right)
{
u = a[left++ % 105];//出列
vis[u] = 0;//让它变回为0
for(i = head[u]; i != -1; i = map[i].next)
{
for(j = 0; j < x; j++)
{
if(dist[map[i].to][(j + 1) % x] > dist[u][j] + map[i].w)//每次更新的路径加一,跟x取余赋值结果,如果是x的倍数,代表取余为0
{
dist[map[i].to][(j + 1) % x] = dist[u][j] + map[i].w;
if(!vis[map[i].to])
{
vis[map[i].to] = 1;
a[right++ % 105] = map[i].to;
}
}
}
}
}
if(dist[e][0] == INF) printf("No Answer!\n");//如果j==0 对应的值 为无穷大,代表没有答案
else printf("%lld\n", dist[e][0]);
}
int main()
{
int t, n, m, u, v, s, e, x, j;
long long w;
scanf("%d", &t);//输入,有几组数据
while(t--)
{
left = 0; right = 0;
memset(head, -1, sizeof(head));//初始化数组为-1;
scanf("%d %d", &n, &m);
j = 0;
while(m--)
{
scanf("%d %d %lld", &u, &v, &w);
map[j].w = w;
map[j].to = v;
map[j].next = head[u];
head[u] = j++;
}
scanf("%d %d %d", &s, &e, &x);
spfa(s, e, x, n);
}
return 0;
}