Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

27-seongwon030 #97

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

27-seongwon030 #97

wants to merge 1 commit into from

Conversation

seongwon030
Copy link
Collaborator

πŸ”— 문제 링크

μ΅œμ†ŒλΉ„μš©κ΅¬ν•˜κΈ°2

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

2μ‹œκ°„

문제 μ„€λͺ…

정점과 κ°„μ„  μ‚¬μ΄μ˜ λΉ„μš©μ΄ 주어지고 좜발 μ§€μ μ—μ„œ 도착 지점에 μ£Όμ–΄μ§ˆ λ•Œ, 좜발 μ§€μ μ—μ„œ 도착 μ§€μ κΉŒμ§€μ˜ μ΅œμ†Œ λΉ„μš©, μ΅œμ†Œ λΉ„μš©μ„ κ°–λŠ” κ²½λ‘œμ— ν¬ν•¨λ˜μ–΄μžˆλŠ” λ„μ‹œμ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€. 좜발 λ„μ‹œμ™€ 도착 λ„μ‹œλ„ ν¬ν•¨ν•œλ‹€.

✨ μˆ˜λ„ μ½”λ“œ

ν•΄λ‹Ή λ¬Έμ œλŠ” λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ΅œμ†ŒλΉ„μš©μ„ κ°±μ‹ ν•˜λ©΄μ„œ μ΅œμ†ŒλΉ„μš©μ„ ꡬ해야 ν•©λ‹ˆλ‹€.
좜λ ₯κ³Όμ •μ—μ„œ 이전 λ…Έλ“œλ₯Ό κΈ°λ‘ν•˜κ³  좜λ ₯ν•˜λŠ”λ° μ• λ₯Ό μ’€ λ¨Ήμ—ˆμŠ΅λ‹ˆλ‹€.

λ‹€μ΅μŠ€νŠΈλΌ

# 데이크 슀트라 μ•Œκ³ λ¦¬μ¦˜
def di(start):
    q = []
    heapq.heappush(q, [0,start]) # μ‹œμž‘λ…Έλ“œλŠ” 거리가 0 / μ‹œμž‘λ…Έλ“œ 번호
    distance[start] = 0 # 첫 λ…Έλ“œ λΉ„μš©μ„ 0으둜 μ„€μ • 

    while q:
      # dist λŠ” ν˜„μž¬ λ…Έλ“œκΉŒμ§€ λ„λ‹¬ν•˜λŠ”λ° κ±Έλ¦° μ΅œμ†ŒλΉ„μš©
      # node λŠ” ν˜„μž¬ λ°©λ¬Έ 쀑인 λ…Έλ“œ
        dist, node = heapq.heappop(q)

        if distance[node] < dist:  # ν˜„μž¬ κΊΌλ‚Έ 거리가 κΈ°μ‘΄ μ΅œλ‹¨κ±°λ¦¬λ³΄λ‹€ 크면 μŠ€ν‚΅
            continue
        for n,w in graph[node]: # ν˜„μž¬ λ…Έλ“œμ˜ 인접 λ…Έλ“œ 탐색
            cost = dist + w # κ°€μ€‘μΉ˜ λ”ν•΄μ„œ μƒˆλ‘œμš΄ 거리λ₯Ό 계산

            if distance[n] > cost: # κΈ°μ‘΄ 거리보닀 짧으면 κ°±μ‹ 
                distance[n]= cost  
                prev_node[n] = node  # 이전 λ…Έλ“œλ₯Ό 기둝
                heapq.heappush(q,[cost,n]) # κ°±μ‹ λœ 인접 λ…Έλ“œλ₯Ό 큐에 μΆ”κ°€ 
  • μ΄μ „λ…Έλ“œ 기둝은 prev_node λ¦¬μŠ€νŠΈμ— μ €μž₯ν•΄λ†“μŠ΅λ‹ˆλ‹€.
  • λ‹€μŒ λ…Έλ“œλ₯Ό κ°±μ‹ ν•˜λŠ” κ²½μš°μ—λ§Œ κΈ°λ‘ν•©λ‹ˆλ‹€.

μ΅œλ‹¨κ±°λ¦¬

di(v1)
print(distance[v2])
  • μ‹œμž‘ 지점인 v1 을 인자둜 ν•˜μ—¬ λ‹€μ΅μŠ€νŠΈλΌ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ -> μΆœλ°œλ…Έλ“œμ—μ„œ λͺ¨λ“  λ…Έλ“œκΉŒμ§€μ˜ μ΅œλ‹¨κ±°λ¦¬λ₯Ό 계산
  • λ„μ°©λ…Έλ“œμ— ν•΄λ‹Ήν•˜λŠ” v2κΉŒμ§€μ˜ 거리λ₯Ό κ΅¬ν•©λ‹ˆλ‹€

이전 λ„μ‹œλ“€

path = [v2]
now = v2
while now != v1:
  now = prev_node[now]
  path.append(now)

path.reverse()
print(len(path))
print(' '.join(map(str,path)))
  • prev_node μ—λŠ” v2(도착 λ…Έλ“œ)κΉŒμ§€μ˜ λ„μ‹œ λ²ˆν˜Έκ°€ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€
  • path : λ„μ°©λ…Έλ“œλ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ ν•˜λŠ” 리슀트
  • 이전 λ…Έλ“œμ—μ„œ μΆœλ°œλ…Έλ“œκ°€ λ‚˜μ˜¬λ•ŒκΉŒμ§€ path에 λ„μ‹œ λ²ˆν˜Έλ“€μ„ μ €μž₯ν•©λ‹ˆλ‹€

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

κ·Έλƒ₯ λ‹¨μˆœν•˜κ²Œ μ΅œμ†Œμ‹ μž₯트리 + 값을 갱신해쀄 λ•Œ 이전 값을 κΈ°μ–΅ν•΄μ£Όλ©΄ λ˜λŠ” λ‹¨μˆœν•œ 문제라고 μƒκ°ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ²˜μŒμ— μ ‘κ·Όν–ˆμ„ λ•Œ μ–‘λ°©ν–₯인 쀄 μ•Œκ³  A <-> B 둜 μ—°κ²°ν•΄μ„œ ν’€μ—ˆμ—ˆμŠ΅λ‹ˆλ‹€.
μ–΄μ°Œμ €μ°Œ 값은 λ‚˜μ˜€μ§€λ§Œ 길을 κΌ¬μ•˜μ„ λ•Œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ μΌ€μ΄μŠ€κ°€ λͺ…ν™•νžˆ μ‘΄μž¬ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κ²Œ 문제λ₯Ό λ‹€μ‹œ μ½μ–΄λ³΄μ•˜μ„ λ•Œ λ²„μŠ€λŠ” λ‹Ήμ—°νžˆ A -> B둜 κ°€λŠ”κ΅¬λ‚˜ 고둜 단방ν–₯μ΄κ΅¬λ‚˜λ₯Ό κΉ¨λ‹«λŠ”λ° μ‹œκ°„μ„ μ’€ 많이 μ†Œμš”ν–ˆμŠ΅λ‹ˆλ‹€ ^^;
μ €λŠ” λ²„μŠ€κ°€ μˆœν™˜ λ²„μŠ€λ„ λ˜λŠ”μ€„ μ•Œκ³  A <-> B μ˜€κ² κ±°λ‹ˆ ν–ˆλŠ”λ° μ•„λ‹ˆλ”λΌκ΅¬μš” γ…Žγ…Ž;
κ·Έλž˜μ„œ A <- B에 λŒ€ν•œ μ½”λ“œλ₯Ό μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. (λ¬Έμ œκ°€ 쑰금 뢈친절 ν•œ 것 κ°™κΈ°λ„ν•˜κ³ ..?)

이제 각 λ„μ‹œμ—μ„œ μ΅œμ†Œ 거리λ₯Ό κ΅¬ν–ˆμœΌλ‹ˆ 이제 ans 배열에 μ§€λ‚˜μ˜¨ λ„μ‹œλ“€μ„ μ €μž₯ν•˜λ©΄ λ˜λŠ”λ° 이 뢀뢄은 λ”°λ‘œ paths 배열을 λ§Œλ“€μ–΄μ„œ ν™œμš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ μ—¬κΈ°μ„œ 첫 번째둜 μ €λŠ” μ‰½κ²Œ κ°€λŠ” 길이 λ– μ˜€λ₯΄μ§€ μ•Šλ”κ΅°μš”. κ·Έλƒ₯ DFS λ°©μ‹μœΌλ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

  1. A번째 λ„μ‹œμ—μ„œ B번째 λ„μ‹œλ‘œ κ°€λŠ” μ΅œμ†Œ λΉ„μš©μ„ M이라고 ν•˜μ˜€μ„ λ•Œ
  2. B번째 λ„μ‹œμ—μ„œ A번째 λ„μ‹œλ‘œ κ°€λŠ” 길듀을 μ—­λ°©ν–₯으둜 νƒμƒ‰ν•΄μ€λ‹ˆλ‹€. μ΄λ•Œ μ—­λ°©ν–₯으둜 κ°€λŠ” 길듀은 λ‹€μ΅μŠ€νŠΈλΌλ₯Ό 톡해 μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•˜λ©΄μ„œ μ €μž₯ν•΄μ€¬μŠ΅λ‹ˆλ‹€.
  3. μ—¬κΈ°μ„œ 계산이 쑰금 ν•„μš”ν•œκ²Œ Mμ΄λΌλŠ” μ΅œμ†Œ λΉ„μš©μ΄ μžˆμ„ λ•Œ B번째 λ„μ‹œμ—μ„œ B-1번째 λ„μ‹œλ‘œ μ΄λ™ν•˜κ²Œ 되면 M - COST[B-1]의 κ²°κ³Ό 값은 A 번째 λ„μ‹œμ—μ„œ B-1 번째 λ„μ‹œλ‘œ κ°€λŠ”λ°μ— μ†Œμš”λ˜λŠ” μ΅œμ†Œ λΉ„μš© κ°’μž…λ‹ˆλ‹€.

고둜 λ‹€μŒ λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ”λ° λ“œλŠ” λΉ„μš©μ„ 뺐을 λ•Œ A 번째 λ„μ‹œμ—μ„œ N 번째 λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” λΉ„μš©μ˜ 값이 λ‚˜μ˜€μ§€ μ•ŠμœΌλ©΄ κ·Έ 길은 μ΅œμ†Œ λΉ„μš©μœΌλ‘œ κ΅¬μ„±λœ λ„μ‹œκ°€ μ•„λ‹ˆλΌλŠ” 점을 μ΄μš©ν•˜μ—¬ λ³΅μž‘λ„λ₯Ό μ€„μ΄κ³ μž λ…Έλ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
μ•„λž˜κ°€ ν•΄λ‹Ή λΆ€λΆ„μž…λ‹ˆλ‹€.

bool FindPath(int cur, int cost)
{
	if (cur == start)
	{
		if(cost == 0) return true;
		return false;
	}

	for (auto node : paths[cur])
	{
		if (visited[node.index]) continue;
		if (distances[node.index] == cost - node.dist)
		{
			visited[node.index] = true;
			if (FindPath(node.index, cost - node.dist))
			{
				ans.push_back(node.index);
				return true;
			}
			visited[node.index] = false;
		}
	}

	return false;
}

λ‹Ήμ—°νžˆ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜κΈΈλž˜ λ‹€μ‹œ 생각을 해봀을 λ•Œ ꡳ이 μ΄λŸ΄ν•„μš”λŠ” μ—†λ”κ΅°μš”. κ·Έλƒ₯ 값이 λ³€ν–ˆμ„ λ•Œ, 즉 값이 λ³€ν•˜λŠ” 것은 μ΅œμ†Œ λΉ„μš© λ£¨νŠΈμ΄κΈ°μ— λ‹€μŒ λ…Έλ“œμ— ν˜„μž¬ λ…Έλ“œμ˜ 인덱슀 값을 μ €μž₯ν•΄μ£Όλ©΄ λ˜μ—ˆλ‹€λŠ” 것을 κΉ¨λ‹«κ³  μˆ˜μ •ν–ˆμ§€λ§Œ κ·Έλž˜λ„ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜λ”κ΅°μš”.

κ·Έλž˜μ„œ μ§ˆλ¬Έκ²Œμ‹œνŒμ„ 쑰금 μ°Έκ³ ν•˜κ²Œ λ˜μ—ˆλ”λ‹ˆ λ²„μŠ€μ˜ κ°œμˆ˜κ°€ μ΅œλŒ€ 10λ§Œκ°œκ°€ μ£Όμ–΄μ§€λŠ”λ° ν˜„μž¬ λ°©λ¬Έν•œ λ…Έλ“œλ₯Ό 기점으둜 μ—°κ²°λ˜μ–΄ μžˆλŠ” λ²„μŠ€λ“€μ˜ 개수λ₯Ό 계속 νƒμƒ‰ν•˜κ²Œ 되면 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•˜λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.
고둜 λ‹€μŒ 지점을 λ°©λ¬Έν•  λ•Œ 뿐만 μ•„λ‹ˆλΌ μš°μ„  μˆœμœ„ 큐에 μ €μž₯λ˜μ–΄ μžˆλŠ” κ°’λ“€μ˜ λΉ„μš©μ΄ μ΅œμ†Œ λΉ„μš©μœΌλ‘œ μ €μž₯λ˜μ–΄ μžˆλŠ” 값보닀 큰 κ²½μš°λŠ” 체크해쀄 ν•„μš”κ°€ μ—†λ‹€λŠ” 것을 κΉ¨λ‹«κ³  쑰건문을 μΆ”κ°€ν•΄μ€¬λ”λ‹ˆ ν†΅κ³Όν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μƒλ‹Ήνžˆ ν”Όκ³€ν–ˆλ˜ λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€..

@InSange
Copy link
Collaborator

InSange commented Aug 29, 2024

κ·Έλƒ₯ λ‹¨μˆœν•˜κ²Œ μ΅œμ†Œμ‹ μž₯트리 + 값을 갱신해쀄 λ•Œ 이전 값을 κΈ°μ–΅ν•΄μ£Όλ©΄ λ˜λŠ” λ‹¨μˆœν•œ 문제라고 μƒκ°ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ²˜μŒμ— μ ‘κ·Όν–ˆμ„ λ•Œ μ–‘λ°©ν–₯인 쀄 μ•Œκ³  A <-> B 둜 μ—°κ²°ν•΄μ„œ ν’€μ—ˆμ—ˆμŠ΅λ‹ˆλ‹€. μ–΄μ°Œμ €μ°Œ 값은 λ‚˜μ˜€μ§€λ§Œ 길을 κΌ¬μ•˜μ„ λ•Œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ μΌ€μ΄μŠ€κ°€ λͺ…ν™•νžˆ μ‘΄μž¬ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κ²Œ 문제λ₯Ό λ‹€μ‹œ μ½μ–΄λ³΄μ•˜μ„ λ•Œ λ²„μŠ€λŠ” λ‹Ήμ—°νžˆ A -> B둜 κ°€λŠ”κ΅¬λ‚˜ 고둜 단방ν–₯μ΄κ΅¬λ‚˜λ₯Ό κΉ¨λ‹«λŠ”λ° μ‹œκ°„μ„ μ’€ 많이 μ†Œμš”ν–ˆμŠ΅λ‹ˆλ‹€ ^^; μ €λŠ” λ²„μŠ€κ°€ μˆœν™˜ λ²„μŠ€λ„ λ˜λŠ”μ€„ μ•Œκ³  A <-> B μ˜€κ² κ±°λ‹ˆ ν–ˆλŠ”λ° μ•„λ‹ˆλ”λΌκ΅¬μš” γ…Žγ…Ž; κ·Έλž˜μ„œ A <- B에 λŒ€ν•œ μ½”λ“œλ₯Ό μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. (λ¬Έμ œκ°€ 쑰금 뢈친절 ν•œ 것 κ°™κΈ°λ„ν•˜κ³ ..?)

이제 각 λ„μ‹œμ—μ„œ μ΅œμ†Œ 거리λ₯Ό κ΅¬ν–ˆμœΌλ‹ˆ 이제 ans 배열에 μ§€λ‚˜μ˜¨ λ„μ‹œλ“€μ„ μ €μž₯ν•˜λ©΄ λ˜λŠ”λ° 이 뢀뢄은 λ”°λ‘œ paths 배열을 λ§Œλ“€μ–΄μ„œ ν™œμš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ μ—¬κΈ°μ„œ 첫 번째둜 μ €λŠ” μ‰½κ²Œ κ°€λŠ” 길이 λ– μ˜€λ₯΄μ§€ μ•Šλ”κ΅°μš”. κ·Έλƒ₯ DFS λ°©μ‹μœΌλ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

  1. A번째 λ„μ‹œμ—μ„œ B번째 λ„μ‹œλ‘œ κ°€λŠ” μ΅œμ†Œ λΉ„μš©μ„ M이라고 ν•˜μ˜€μ„ λ•Œ
  2. B번째 λ„μ‹œμ—μ„œ A번째 λ„μ‹œλ‘œ κ°€λŠ” 길듀을 μ—­λ°©ν–₯으둜 νƒμƒ‰ν•΄μ€λ‹ˆλ‹€. μ΄λ•Œ μ—­λ°©ν–₯으둜 κ°€λŠ” 길듀은 λ‹€μ΅μŠ€νŠΈλΌλ₯Ό 톡해 μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•˜λ©΄μ„œ μ €μž₯ν•΄μ€¬μŠ΅λ‹ˆλ‹€.
  3. μ—¬κΈ°μ„œ 계산이 쑰금 ν•„μš”ν•œκ²Œ Mμ΄λΌλŠ” μ΅œμ†Œ λΉ„μš©μ΄ μžˆμ„ λ•Œ B번째 λ„μ‹œμ—μ„œ B-1번째 λ„μ‹œλ‘œ μ΄λ™ν•˜κ²Œ 되면 M - COST[B-1]의 κ²°κ³Ό 값은 A 번째 λ„μ‹œμ—μ„œ B-1 번째 λ„μ‹œλ‘œ κ°€λŠ”λ°μ— μ†Œμš”λ˜λŠ” μ΅œμ†Œ λΉ„μš© κ°’μž…λ‹ˆλ‹€.

고둜 λ‹€μŒ λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ”λ° λ“œλŠ” λΉ„μš©μ„ 뺐을 λ•Œ A 번째 λ„μ‹œμ—μ„œ N 번째 λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” λΉ„μš©μ˜ 값이 λ‚˜μ˜€μ§€ μ•ŠμœΌλ©΄ κ·Έ 길은 μ΅œμ†Œ λΉ„μš©μœΌλ‘œ κ΅¬μ„±λœ λ„μ‹œκ°€ μ•„λ‹ˆλΌλŠ” 점을 μ΄μš©ν•˜μ—¬ λ³΅μž‘λ„λ₯Ό μ€„μ΄κ³ μž λ…Έλ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ•„λž˜κ°€ ν•΄λ‹Ή λΆ€λΆ„μž…λ‹ˆλ‹€.

bool FindPath(int cur, int cost)
{
	if (cur == start)
	{
		if(cost == 0) return true;
		return false;
	}

	for (auto node : paths[cur])
	{
		if (visited[node.index]) continue;
		if (distances[node.index] == cost - node.dist)
		{
			visited[node.index] = true;
			if (FindPath(node.index, cost - node.dist))
			{
				ans.push_back(node.index);
				return true;
			}
			visited[node.index] = false;
		}
	}

	return false;
}

λ‹Ήμ—°νžˆ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜κΈΈλž˜ λ‹€μ‹œ 생각을 해봀을 λ•Œ ꡳ이 μ΄λŸ΄ν•„μš”λŠ” μ—†λ”κ΅°μš”. κ·Έλƒ₯ 값이 λ³€ν–ˆμ„ λ•Œ, 즉 값이 λ³€ν•˜λŠ” 것은 μ΅œμ†Œ λΉ„μš© λ£¨νŠΈμ΄κΈ°μ— λ‹€μŒ λ…Έλ“œμ— ν˜„μž¬ λ…Έλ“œμ˜ 인덱슀 값을 μ €μž₯ν•΄μ£Όλ©΄ λ˜μ—ˆλ‹€λŠ” 것을 κΉ¨λ‹«κ³  μˆ˜μ •ν–ˆμ§€λ§Œ κ·Έλž˜λ„ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜λ”κ΅°μš”.

κ·Έλž˜μ„œ μ§ˆλ¬Έκ²Œμ‹œνŒμ„ 쑰금 μ°Έκ³ ν•˜κ²Œ λ˜μ—ˆλ”λ‹ˆ λ²„μŠ€μ˜ κ°œμˆ˜κ°€ μ΅œλŒ€ 10λ§Œκ°œκ°€ μ£Όμ–΄μ§€λŠ”λ° ν˜„μž¬ λ°©λ¬Έν•œ λ…Έλ“œλ₯Ό 기점으둜 μ—°κ²°λ˜μ–΄ μžˆλŠ” λ²„μŠ€λ“€μ˜ 개수λ₯Ό 계속 νƒμƒ‰ν•˜κ²Œ 되면 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•˜λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. 고둜 λ‹€μŒ 지점을 λ°©λ¬Έν•  λ•Œ 뿐만 μ•„λ‹ˆλΌ μš°μ„  μˆœμœ„ 큐에 μ €μž₯λ˜μ–΄ μžˆλŠ” κ°’λ“€μ˜ λΉ„μš©μ΄ μ΅œμ†Œ λΉ„μš©μœΌλ‘œ μ €μž₯λ˜μ–΄ μžˆλŠ” 값보닀 큰 κ²½μš°λŠ” 체크해쀄 ν•„μš”κ°€ μ—†λ‹€λŠ” 것을 κΉ¨λ‹«κ³  쑰건문을 μΆ”κ°€ν•΄μ€¬λ”λ‹ˆ ν†΅κ³Όν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μƒλ‹Ήνžˆ ν”Όκ³€ν–ˆλ˜ λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€..

전체 μ½”λ“œ μž…λ‹ˆλ‹€.

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct Node
{
	int index;
	int dist;

	Node(int index, int dist)
	{
		this->index = index;
		this->dist = dist;
	}
};

int n, m, start, goal;
vector<vector<Node>> nodes;
vector<int> paths;
vector<int> distances;
vector<bool> visited;

void Solve()
{
	cin >> n;

	nodes.assign(n + 1, vector<Node>());
	paths.assign(n + 1, 0);
	distances.assign(n + 1, 1e8);
	visited.assign(n + 1, false);

	cin >> m;

	while (m--)
	{
		int v1, v2, edge;

		cin >> v1 >> v2 >> edge;

		nodes[v1].push_back(Node(v2, edge));
	}
	
	cin >> start >> goal;

	priority_queue < pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

	distances[start] = 0;
	pq.push({ 0, start });

	while (!pq.empty())
	{
		int cur_index = pq.top().second;
		int cur_dist = pq.top().first;
		pq.pop();

		if (cur_dist > distances[cur_index]) continue;
		for (auto node : nodes[cur_index])
		{
			int next_index = node.index;
			int next_dist = node.dist + cur_dist;

			if (next_dist < distances[next_index])
			{
				distances[next_index] = next_dist;
				pq.push({ next_dist, next_index });
				paths[next_index] = cur_index;
			}
		}
	}

	cout << distances[goal] << "\n";
	
	vector<int> ans;

	ans.push_back(goal);
	while (goal != start)
	{
		ans.push_back(paths[goal]);
		goal = paths[goal];
	}

	cout << ans.size() << "\n";

	auto printReverse = [&ans]() {
		for (auto it = ans.rbegin(); it != ans.rend(); ++it)
		{
			cout << *it << " ";
		}
		};

	printReverse();
}

int main()
{
	cin.tie(nullptr);
	ios::sync_with_stdio(false);

	Solve();

	return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants