最短路径 sfpa + 前向星

最短路径
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
#include
#include
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;
}

你可能感兴趣的:(最短路)