Problem:


Score : 500 points

Problem Statement

There are N towns numbered 1 to N and M roads. The i-th road connects Town A_i and Town B_i bidirectionally and has a length of C_i.

Takahashi will travel between these towns by car, passing through these roads. The fuel tank of his car can contain at most L liters of fuel, and one liter of fuel is consumed for each unit distance traveled. When visiting a town while traveling, he can full the tank (or choose not to do so). Travel that results in the tank becoming empty halfway on the road cannot be done.

Process the following Q queries:

The tank is now full. Find the minimum number of times he needs to full his tank while traveling from Town s_i to Town t_i. If Town t_i is unreachable, print -1.

Constraints

All values in input are integers.

2 \leq N \leq 300

0 \leq M \leq \frac{N(N-1)}{2}

1 \leq L \leq 10^9

1 \leq A_i, B_i \leq N

A_i \neq B_i

\left(A_i, B_i\right) \neq \left(A_j, B_j\right) (if i \neq j)

\left(A_i, B_i\right) \neq \left(B_j, A_j\right) (if i \neq j)

1 \leq C_i \leq 10^9

1 \leq Q \leq N\left(N-1\right)

1 \leq s_i, t_i \leq N

s_i \neq t_i

\left(s_i, t_i\right) \neq \left(s_j, t_j\right) (if i \neq j)

Input

Input is given from Standard Input in the following format:

N M L
A_1 B_1 C_1
:
A_M B_M C_M
Q
s_1 t_1
:
s_Q t_Q

Output

Print Q lines.

The i-th line should contain the minimum number of times the tank needs to be fulled while traveling from Town s_i to Town t_i. If Town t_i is unreachable, the line should contain -1 instead.

Sample Input 1

3 2 5
1 2 3
2 3 3
2
3 2
1 3

Sample Output 1

0
1

To travel from Town 3 to Town 2, we can use the second road to reach Town 2 without fueling the tank on the way.

To travel from Town 1 to Town 3, we can first use the first road to get to Town 2, full the tank, and use the second road to reach Town 3.

Sample Input 2

4 0 1
1
2 1

Sample Output 2

-1

There may be no road at all.

Sample Input 3

5 4 4
1 2 2
2 3 2
3 4 3
4 5 2
20
2 1
3 1
4 1
5 1
1 2
3 2
4 2
5 2
1 3
2 3
4 3
5 3
1 4
2 4
3 4
5 4
1 5
2 5
3 5
4 5

Sample Output 3

0
0
1
2
0
0
1
2
0
0
0
1
1
1
0
0
2
2
1
0



Sample input:
3 2 5
1 2 3
2 3 3
2
3 2
1 3


Sample output:
0
1

Submission status: Accepted

Solution code:
import subprocess
import gzip, base64, os
import stat

gz = b'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'
bin = gzip.decompress(base64.b64decode(gz))
p = os.path.dirname(__file__)
pymain = os.path.join(p, "a.out")
with open(pymain, "wb") as f:
    f.write(bin)
os.chmod(pymain, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
if p == "":
    pymain = "./" + pymain
subprocess.call(pymain)


# compiled by pythran
'''
#pythran export main2()
import numpy as np
i8 = np.int64
i4 = np.int32

def floyd_warshall(graph):
    n = graph.shape[0]
    for k in range(n):
        for i in range(n):
            for j in range(n):
                graph[i, j] = min(graph[i, j], graph[i, k] + graph[k, j])

def clac(graph, L):
    for i in range(graph.shape[0]):
        for j in range(graph.shape[1]):
            graph[i, j] = 10 ** 10 if graph[i, j] > L else 1

def main2():
    inf = 10**10
    stdin = open('/dev/stdin')
    N, M, L = map(int, stdin.readline().split())
    graph = np.empty((N, N), i8)
    for i in range(N):
        for j in range(N):
            graph[i, j] = inf
    for _ in range(M):
        a, b, c = map(int, stdin.readline().split())
        graph[a - 1, b - 1] = c
        graph[b - 1, a - 1] = c
    Q = int(stdin.readline())
    s = np.empty(Q, i8)
    t = np.empty(Q, i8)
    for i in range(Q):
        s[i], t[i] = map(int, stdin.readline().split())

    floyd_warshall(graph)
    clac(graph, L)
    floyd_warshall(graph)
    graph[graph > L] = 0
    x = []
    for i in range(Q):
        x.append(str(graph[s[i] - 1, t[i] - 1] - 1))
    print('\n'.join(x))
'''

Submission status: Accepted

Solution code:
import sys

input = sys.stdin.readline


class AtCoder:
    def main(self):
        N, M, L = map(int, input().split())
        ABC = [tuple(map(int, input().split())) for _ in range(M)]
        Q = int(input())
        st = [tuple(map(int, input().split())) for _ in range(Q)]

        INF = 10 **10
        load = [[INF] * N for _ in range(N)]
        for a, b, c in ABC:
            a -= 1
            b -= 1
            load[a][b] = c
            load[b][a] = c

        for k in range(N):
            for i in range(N):
                for j in range(N):
                    load[i][j] = min(load[i][j], load[i][k] + load[k][j])

        load2 = [[INF] * N for _ in range(N)]
        for i in range(N):
            for j in range(N):
                if load[i][j] <= L:
                    load2[i][j] = 1

        for k in range(N):
            for i in range(N):
                for j in range(N):
                    load2[i][j] = min(load2[i][j], load2[i][k] + load2[k][j])

        for s, t in st:
            s -=1
            t-=1
            if load2[s][t] == INF:
                print(-1)
            else:
                print(load2[s][t] - 1)


# Run main
if __name__ == '__main__':
    AtCoder().main()

Submission status: Accepted

Solution code:
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.csgraph import floyd_warshall
i8 = np.int64
i4 = np.int32


def main():
    stdin = open('/dev/stdin')
    pin = np.fromstring(stdin.read(), i8, sep=' ')
    N = pin[0]
    M = pin[1]
    L = pin[2]
    ABC = pin[3: M * 3 + 3].reshape((-1, 3))
    A = ABC[:, 0] - 1
    B = ABC[:, 1] - 1
    C = ABC[:, 2]
    Q = pin[M * 3 + 3]
    st = (pin[M * 3 + 4: 2 * Q + M * 3 + 4] - 1).reshape((-1, 2))
    s = st[:, 0]
    t = st[:, 1]

    graph = csr_matrix((C, (A, B)), shape=(N, N))
    dist = np.array(floyd_warshall(graph, directed=False))
    dist[dist > L + 0.5] = 0
    dist[dist > 0] = 1
    min_dist = np.array(floyd_warshall(dist))
    min_dist[min_dist == np.inf] = 0

    min_dist = (min_dist + .5).astype(int)
    x = min_dist[s, t] - 1
    print('\n'.join(x.astype(str).tolist()))


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.csgraph import floyd_warshall
i8 = np.int64
i4 = np.int32


def main():
    stdin = open('/dev/stdin')
    pin = np.fromstring(stdin.read(), i8, sep=' ')
    N = pin[0]
    M = pin[1]
    L = pin[2]
    ABC = pin[3: M * 3 + 3].reshape((-1, 3))
    A = ABC[:, 0] - 1
    B = ABC[:, 1] - 1
    C = ABC[:, 2]
    Q = pin[M * 3 + 3]
    st = (pin[M * 3 + 4: 2 * Q + M * 3 + 4] - 1).reshape((-1, 2))
    s = st[:, 0]
    t = st[:, 1]

    graph = csr_matrix((C, (A, B)), shape=(N, N))
    dist = np.array(floyd_warshall(graph, directed=False))
    dist[dist > L + 0.5] = 0
    dist[dist > 0] = 1
    min_dist = np.array(floyd_warshall(dist))
    min_dist[min_dist == np.inf] = 0

    min_dist = (min_dist + .5).astype(int)
    x = min_dist[s, t] - 1
    print('\n'.join(x.astype(str)))


if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.csgraph import floyd_warshall
i8 = np.int64
i4 = np.int32


def main():
    stdin = open('/dev/stdin')
    pin = np.fromstring(stdin.read(), i8, sep=' ')
    N = pin[0]
    M = pin[1]
    L = pin[2]
    ABC = pin[3: M * 3 + 3].reshape((-1, 3))
    A = ABC[:, 0] - 1
    B = ABC[:, 1] - 1
    C = ABC[:, 2]
    Q = pin[M * 3 + 3]
    st = (pin[M * 3 + 4: 2 * Q + M * 3 + 4] - 1).reshape((-1, 2))

    graph = csr_matrix((C, (A, B)), shape=(N, N))
    dist = np.array(floyd_warshall(graph, directed=False))
    dist[dist > L + 0.5] = 0
    dist[dist > 0] = 1
    min_dist = np.array(floyd_warshall(dist))
    min_dist[min_dist == np.inf] = 0
    for i in range(st.shape[0]):
        print(int(min_dist[st[i, 0], st[i, 1]] - 1.0))


if __name__ == '__main__':
    main()