Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.38 KB | None | 0 0
  1. n,f,r = map(int,input().split())
  2.  
  3. a = list(range(f))
  4. b = list(range(f))
  5. c = list(range(f))
  6. for x in range(f):
  7.     a[x],b[x],c[x] = map(int,input().split())
  8.  
  9. i = list(range(r))
  10. j = list(range(r))
  11. k = list(range(r))
  12. for x in range(r):
  13.     i[x],j[x],k[x] = map(int,input().split())
  14.  
  15. #cria o GRAPH baseado nas entradas
  16. graph = {}
  17. for x in range(1,n+1):
  18.     paths = {}
  19.     for y in range(f):
  20.         paths2 = {}
  21.         if a[y] == x:
  22.             if not b[y] in paths.keys():
  23.                 paths[b[y]] = {}
  24.  
  25.             #irá verificar se a nova aresta informada é maior ou menor do que
  26.             #uma possível aresta já informada e manterá a menor
  27.             checkEqual = paths[b[y]]
  28.             newWeight = c[y]
  29.             if 'rail' in checkEqual.keys():
  30.                 if checkEqual['rail'] < c[y]:
  31.                     newWeight = checkEqual['rail']
  32.             checkEqual.update({'rail':newWeight})
  33.  
  34.         if b[y] == x:
  35.             if not a[y] in paths.keys():
  36.                 paths[a[y]] = {}
  37.             checkEqual = paths[a[y]]
  38.             newWeight = c[y]
  39.             if 'rail' in checkEqual.keys():
  40.                 if checkEqual['rail'] < c[y]:
  41.                     newWeight = checkEqual['rail']
  42.             checkEqual.update({'rail':newWeight})
  43.  
  44.  
  45.     for y in range(r):
  46.         paths2 = {}
  47.         if i[y] == x:
  48.             if not j[y] in paths.keys():
  49.                 paths[j[y]] = {}
  50.             checkEqual = paths[j[y]]
  51.             newWeight = k[y]
  52.             if 'road' in checkEqual.keys():
  53.                 if checkEqual['road'] < k[y]:
  54.                     newWeight = checkEqual['road']
  55.             checkEqual.update({'road':newWeight})
  56.  
  57.  
  58.         if j[y] == x:
  59.             if not i[y] in paths.keys():
  60.                 paths[i[y]] = {}
  61.             checkEqual = paths[i[y]]
  62.             newWeight = k[y]
  63.             if 'road' in checkEqual.keys():
  64.                 if checkEqual['road'] < k[y]:
  65.                     newWeight = checkEqual['road']
  66.             checkEqual.update({'road':newWeight})
  67.  
  68.     graph[x] = paths
  69.  
  70. # input(graph)
  71.  
  72. # GRAPH INPUT TEST
  73. # graph = {1: {2: {'rail': 40}, 3: {'rail': 50}}, 2: {1: {'rail': 40}, 3: {'rail': 30}, 4: {'road': 40}}, 3: {1: {'rail': 50}, 2: {'rail': 30}, 4: {'rail': 50}}, 4: {3: {'rail': 50}, 2: {'road': 40}}}
  74. # n = 4
  75.  
  76. #inicializa um dicionário para:
  77. # - uma QUEUE de vértices, que será analizada, item a item, para verificar os EDGES
  78. # - KEYS, que representa o menor WEIGHT encontrado para chegar
  79. # naquele vértice até então
  80. # - condicinal EDGEROAD que é um caso específico do problema, onde
  81. # o peso não é prioridade, mas sim se o EDGE é rail ou roads
  82. # - PARENT, que não é exigência do problema, mas permite rastrear as EDGES
  83.  
  84. vertexQueue = {}
  85. vertexKeys = {}
  86. vertexEdgeRoad = {}
  87. vertexParent = {}
  88. #para armazenar os EDGES (apenas para facilitar conferência), o problema
  89. #não pede
  90. mstEdges = {}
  91. edgesCounter = 0
  92.  
  93. for x in range(1,n+1):
  94.     #inicializa todos os dicionários com valores máximos pra KEYS e roads
  95.     #e zera o Parent
  96.     vertexQueue[x] = x
  97.     vertexKeys[x] = float('inf')
  98.     vertexEdgeRoad[x] = 1
  99.     vertexParent[x] = None
  100.  
  101.  
  102. vertexKeys[1] = 0
  103. edges = {}
  104.  
  105. while vertexQueue:
  106.  
  107.     #vai verificar qual a menor KEY dos vértices que ainda estão no vertexQueue
  108.     minKey = float('inf')
  109.     minRoad = 1
  110.     for v in vertexQueue.keys():
  111.         if vertexEdgeRoad[v] <= minRoad and vertexKeys[v] <= minKey:
  112.             minRoad = vertexEdgeRoad[v]
  113.             minKey = vertexKeys[v]
  114.             minV = v
  115.     #fixaremos o vértice em análise (menor KEY em vertexQueue) como u
  116.     u = minV
  117.     vertexQueue.pop(u)
  118.  
  119.     if vertexParent[u] != None:
  120.         if vertexEdgeRoad[u] == 1:
  121.             pathType = 'road'
  122.         else:
  123.             pathType = 'rail'
  124.         edgesCounter += 1
  125.         mstEdges.update({edgesCounter:str(vertexParent[u])+'-'+str(u)+' ('+pathType+' / w:'+str(vertexKeys[u])+')'})
  126.  
  127.  
  128.         #origem do edge até o vértice u
  129.  
  130.     #como não temos somente o WEIGHT da EDGE, extraímos o dicionário
  131.     #de dentro da iteração do graph[u] para poder trabalhar tanto com
  132.     #o WEIGHT quanto com o ROAD do EDGE
  133.     edgesU = graph[u]
  134.  
  135.     #vamos iterar todos os vértices conectados a [u]
  136.     #edge recebe um inteiro chave do dicionário graph[u], como o graph
  137.     #está em ordem crescente, vai equivaler ao vértice certo
  138.     for edge in edgesU.keys():
  139.  
  140.         #verifica se a edge ainda percente a QUEUE ou se já foi iterada
  141.         if edge in vertexQueue.keys():
  142.  
  143.             if 'rail' in edgesU[edge].keys():
  144.                 edgeWeight = edgesU[edge].get('rail')
  145.                 edgeRoad = 0
  146.             else:
  147.                 edgeWeight = edgesU[edge].get('road')
  148.                 edgeRoad = 1
  149.  
  150.             #Condições para atualização de valores
  151.             #Se for FERROVIA sobrescreve RODOVIA independente do peso
  152.             #Se for o mesmo tipo, avalia o peso
  153.             update = False
  154.             if vertexEdgeRoad[edge] > edgeRoad:
  155.                 update = True
  156.             elif vertexEdgeRoad[edge] == edgeRoad and vertexKeys[edge] > edgeWeight:
  157.                 update = True
  158.  
  159.             if update:
  160.                 vertexKeys[edge] = edgeWeight
  161.                 vertexEdgeRoad[edge] = edgeRoad
  162.                 vertexParent[edge] = u
  163.  
  164. # print(mstEdges)
  165.  
  166. edgeTotalWeight = sum(vertexKeys.values())
  167. print(edgeTotalWeight)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement