2933 - TollRoads

From Bitnami MediaWiki

Cerința[edit | edit source]

N orașe sunt conectate între ele prin M autostrăzi bidirecționale, fiecare autostradă (a, b) având un cost de tranzit c atașat. Se dorește revizuirea sistemului de taxare, însă sunt câteva aspecte ce trebuie luate în calcul și necesită investigație, deoarece o parte dintre cele N orașe sunt centre comerciale sau turistice importante.

Se dorește să se afle răspunsul la o serie de Q întrebări de forma: (X, T) – câte dintre celelalte N-1 orașe au acces către orașul X, cu o taxă totală de cel mult T către fiecare oraș?

Date de intrare[edit | edit source]

Fișierul de intrare tollroads.in conține pe primul rând numerele N, M și Q reprezentând numărul de orașe, numărul de autostrăzi și numărul de interogări. Pe fiecare din următoarele M rânduri sunt scrise câte trei numere a, b, c, separate prin câte un spațiu, reprezentând două orașe între care există o autostradă și costul autostrăzii. Pe următoarele Q rânduri se află scrise câte două numere X și T, separate prin spațiu, reprezentând datele interogărilor, conform enunțului.

Date de ieșire[edit | edit source]

În fișierul de ieșire tollroads.out se vor scrie pe fiecare dintre primele Q rânduri câte un singur număr, reprezentând răspunsurile la interogări, în ordinea în care ele au fost puse.

Restricții și precizări[edit | edit source]

  • 1 ≤ N ≤ 100.000
  • 1 ≤ M ≤ 100.000
  • 1 ≤ a, b ≤ N
  • 1 ≤ c ≤ 100.000
  • 1 ≤ T ≤ 100.000
  • 1 ≤ Q ≤ 100
  • între orice două orașe poate exista mai mult de o autostrada

Exemplu:[edit | edit source]

tollroads.in

7 8 5
1 2 1
2 3 2
2 4 4
3 5 1
4 5 1
5 6 2
1 6 5
6 7 1
1 6
1 5
1 4
2 3
4 4

tollroads.out

6
5
3
3
5

Explicație[edit | edit source]

Orașele 2,3,4,5,6,7 au acces către orașul 1 cu taxă maximă 6

Orașele 2,3,4,5,6 au acces către orașul 1 cu taxă maximă 5

Orașele 2,3,5 au acces către orașul 1 cu taxă maximă 4

Orașele 1,3,5 au acces către orașul 2 cu taxă maximă 3

Orașele 2,3,5,6,7 au acces către orașul 4 cu taxă maximă 4

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> from collections import defaultdict, deque

INF = 2000000002

def main():

   f = open("tollroads.in", "r")
   g = open("tollroads.out", "w")
   n, m, Q = map(int, f.readline().split())
   graph = defaultdict(list)
   for _ in range(m):
       x, y, c = map(int, f.readline().split())
       graph[x].append((y, c))
       graph[y].append((x, c))
   for _ in range(Q):
       nod, taxa = map(int, f.readline().split())
       dr = [INF] * (n + 1)
       din = [[] for _ in range(taxa + 1)]
       din[0].append(nod)
       dr[nod] = sol = 0
       viz = [False] * (n + 1)
       for i in range(taxa + 1):
           for nod in din[i]:
               if viz[nod]:
                   continue
               for ve, co in graph[nod]:
                   if dr[nod] + co > taxa or viz[ve]:
                       continue
                   if dr[ve] > dr[nod] + co:
                       dr[ve] = dr[nod] + co
                       din[dr[ve]].append(ve)
               viz[nod] = True
           din[i] = []
       for i in range(1, n + 1):
           viz[i] = False
           if dr[i] != INF:
               sol += 1
       
       g.write(str(sol - 1) + '\n')
   f.close()
   g.close()

if __name__ == "__main__":

   main()

</syntaxhighlight>