반응형

   문제

   https://www.acmicpc.net/problem/9370




후보지까지의 최단거리가 g->h로 가는길을 지나고 있는가를 물어보는 문제이다.
s->g->h->c 가 s->c이거나 s->h->g->c가 s->c이면 후보지가 될수있는것이다.
문제를 차분히 읽어보면 그렇게 복잡한 문제는 아니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import sys
import heapq
 
def Dijkstra(start,n):#출발점 노드개수
    q=[]
    heapq.heappush(q,[0,start])
    INF=sys.maxsize
    result=[INF for _ in range(n+1)]
    result[start]=0
    while q:
        dis,start=heapq.heappop(q)
        if dis>result[start]:
            continue
        for d,x in G[start]:
            d+=dis
            if d<result[x]:
                result[x]=d
                heapq.heappush(q,[d,x])
 
 
    return result
 
 
 
 
 
T=int(sys.stdin.readline())
for _ in range(T):
    n,m,t=map(int,sys.stdin.readline().split())#교차로,도로,목적지 후보의 개수
    s,g,h=map(int,sys.stdin.readline().split())#예술가들의 출발지,거쳐가는 길에 연결된 노드들
    G=[[] for _ in range(n+1)]
    for _ in range(m):#양방향
        a,b,d=map(int,sys.stdin.readline().split())#노드1,노드2,거리
        G[a].append([d,b])
        G[b].append([d,a])
 
    candidate=[]
 
    for _ in range(t):
        candidate.append(int(sys.stdin.readline()))
 
 
    #출발점에서 거쳐가는길에 연결된 노드
    #거쳐가는길에 연결된 노드에서 후보지로 가는경우 모두확인
    #출발점에서 후보지까지의 거리와 거쳐가는길을 통해 후보지로 간 거리를 비교하여 같은거 출력
    result=[]
    distanses = Dijkstra(s,n)#출발지에서의 거리들
    distanses_node1=Dijkstra(g,n)#g에서 출발
    distanses_node2=Dijkstra(h,n)#h에서 출발
    distanse_g_h=0
    for d,x in G[g]:#g->h까지의 거리
        if x==h:
            distanse_g_h=d
            break
    for c in candidate:#후보지들 하나씩 비교
        #s->g->h->c이 s->c와 같거나
        #s->h->g->c가 s->c와 같다면 후보지이다.
        if distanses[c]==distanses[g]+distanse_g_h+distanses_node2[c] or distanses[c]==distanses[h]+distanse_g_h+distanses_node1[c]:
            result.append(c)
 
    result.sort()
    print(*result)
    # for i in result:
    #     print(i,end=" ")

cs




반응형

'알고리즘(python) > 탐색' 카테고리의 다른 글

[Python]최단경로 백준 11404  (0) 2020.02.23
[Python]최단경로 백준 1865  (0) 2020.02.22
[Python]최단경로 백준 1504  (0) 2020.02.19
[Python]최단경로 백준 1753  (1) 2020.02.17
[Python]DFS와BFS 백준 2206  (0) 2020.02.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기