2539 - flori4

From Bitnami MediaWiki

Compania lui Jimmy are n plantații cu flori. Pentru fiecare plantație se cunoaște tipul florilor cultivate, respectiv câte tone de flori au fost produse anul acesta. Se cunoaște că plantațiile cu flori sunt conectate prin n - 1 drumuri astfel încât la fiecare plantație se poate ajunge de la oricare altă plantație și există un singur mod de ajunge de la plantația x la plantația y , pentru fiecare 1 ≤ x, y ≤ n. De asemenea, știm și distanța în km pentru fiecare dintre cele n - 1 drumuri.

Cerința[edit | edit source]

Jimmy vrea să aducă toate florile de același tip în același loc, cu cost minim de transport. Dacă avem a tone de flori şi vrem să le trimitem pe o distanță de b kilometri, costul transportului este a * b. Pentru fiecare tip de floare Jimmy vrea să determine costul minim de transport pentru a aduce toate florile de același tip la un loc.

Date de intrare[edit | edit source]

Pe prima linie se va găsi numărul n, apoi, pe cea de-a doua linie, n litere mici separate între ele prin câte un spațiu, care simbolizează tipul de floare produs pe plantația i (fiecare tip de floare este o literă mică a alfabetului englez). Pe cea de-a treia linie se găsesc n numere întregi care reprezintă câte tone din fiecare floare au fost produse pe plantația i. Pe fiecare dintre următoarele n - 1 linii se găsesc trei numere naturale x, y, d, cu semnificația că există drum direct între plantațiile x şi y, iar numărul d reprezintă distanța de la x la y.

Date de ieșire[edit | edit source]

Pe prima linie se afișează 26 de numere separate prin spațiu, al i-lea număr reprezentând costul minim de transport pentru tipul de floare specificat de litera de pe poziția i în alfabetul englez (răspunsurile sunt în ordinea în care literele se găsesc în alfabet).

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

  • 4 ≤ n < 200 001.
  • Fiecare dintre numerele din datele de intrare este un număr natural mai mic decât 200 001.
  • Destinaţia finală a fiecărui transport este una dintre cele n plantaţii existente.
  • Dacă există litere care nu reprezintă codul tipului unei flori, atunci costul minim de transport pentru acel tip este 0.
  • Pentru 20% din teste, n < 1000.
  • Pentru alte 25% din teste, n < 100 000.

Exemplu:[edit | edit source]

Intrare

4
a b a b
2 4 4 3
1 3 4
3 4 2
1 2 5

Ieșire

8 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> import heapq


def dijkstra(graph, start):

   n = len(graph)
   dist = [float('inf')] * n
   dist[start] = 0
   pq = [(0, start)]  # Priority queue of tuples (distance, vertex)
   while pq:
       d, u = heapq.heappop(pq)
       if d > dist[u]:
           continue
       for v, w in graph[u]:
           if dist[u] + w < dist[v]:
               dist[v] = dist[u] + w
               heapq.heappush(pq, (dist[v], v))
   return dist


def calculate_transport_cost(types, quantities, distances):

   n = len(types)
   types_cost = [0] * 26
   for t in range(26):
       nodes = {i for i in range(n) if ord(types[i]) - ord('a') == t}
       if not nodes:
           continue
       dist = dijkstra(distances, next(iter(nodes)))  # Selectăm primul nod din set
       for i in range(n):
           if ord(types[i]) - ord('a') == t:
               types_cost[t] += quantities[i] * dist[i]
   return types_cost


n = int(input()) types = input().split() quantities = list(map(int, input().split()))

distances = [[] for _ in range(n)] for _ in range(n - 1):

   x, y, d = map(int, input().split())
   distances[x - 1].append((y - 1, d))
   distances[y - 1].append((x - 1, d))

result = calculate_transport_cost(types, quantities, distances)


print(*result)

</syntaxhighlight>