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

18-seongwon030 #69

Merged
merged 1 commit into from
Jul 14, 2024
Merged

18-seongwon030 #69

merged 1 commit into from
Jul 14, 2024

Conversation

seongwon030
Copy link
Collaborator

πŸ”— 문제 링크

μ •λ³΅μž

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

1μ‹œκ°„

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

문제

문제

μ„œκ°• λ‚˜λΌλŠ” N개의 λ„μ‹œμ™€ M개의 λ„λ‘œλ‘œ μ΄λ£¨μ–΄μ‘Œλ‹€. λͺ¨λ“  λ„μ‹œμ˜ μŒμ—λŠ” κ·Έ λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œλ‘œ κ΅¬μ„±λœ κ²½λ‘œκ°€ μžˆλ‹€. 각 λ„λ‘œλŠ” μ–‘λ°©ν–₯ λ„λ‘œμ΄λ©°, 각 λ„λ‘œλŠ” μ‚¬μš©ν•˜λŠ”λ° ν•„μš”ν•œ λΉ„μš©μ΄ μ‘΄μž¬ν•œλ‹€. 각각 λ„μ‹œλŠ” 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ λΆ™μ—¬μ Έ μžˆλ‹€. κ·Έ μ€‘μ—μ„œ 1번 λ„μ‹œμ˜ κ΅°μ£Ό 박건은 λͺ¨λ“  λ„μ‹œλ₯Ό μ •λ³΅ν•˜κ³  μ‹Άμ–΄ν•œλ‹€.

처음 μ κ±°ν•˜κ³  μžˆλŠ” λ„μ‹œλŠ” 1번 λ„μ‹œ 뿐이닀. λ§Œμ•½ νŠΉμ • λ„μ‹œ Bλ₯Ό μ •λ³΅ν•˜κ³  μ‹Άλ‹€λ©΄, B와 λ„λ‘œλ‘œ μ—°κ²°λœ λ„μ‹œλ“€ μ€‘μ—μ„œ 적어도 ν•˜λ‚˜λ₯Ό μ •λ³΅ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€. 쑰건을 λ§Œμ‘±ν•˜λŠ” λ„μ‹œ μ€‘μ—μ„œ ν•˜λ‚˜μΈ Aλ₯Ό μ„ νƒν•˜λ©΄, Bλ₯Ό μ •λ³΅ν•˜λŠ” κ³Όμ •μ—μ„œ A와 Bλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œμ˜ λΉ„μš©μ΄ μ†Œλͺ¨λœλ‹€. 박건은 ν•œλ²ˆμ— ν•˜λ‚˜μ˜ λ„μ‹œλ§Œ 정볡을 μ‹œλ„ν•˜κ³  μ–Έμ œλ‚˜ μ„±κ³΅ν•œλ‹€. ν•œ 번 λ„μ‹œκ°€ μ •λ³΅λ˜λ©΄, λͺ¨λ“  λ„μ‹œλŠ” 경계λ₯Ό ν•˜κ²Œ 되기 λ•Œλ¬Έμ— λͺ¨λ“  λ„λ‘œμ˜ λΉ„μš©μ΄ t만큼 μ¦κ°€ν•˜κ²Œ λœλ‹€. ν•œ 번 μ •λ³΅ν•œ λ„μ‹œλŠ” λ‹€μ‹œ μ •λ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ΄λ•Œ 박건이 λͺ¨λ“  λ„μ‹œλ₯Ό μ •λ³΅ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 Nκ³Ό λ„λ‘œμ˜ 개수 Mκ³Ό ν•œλ²ˆ 정볡할 λ•Œλ§ˆλ‹€ μ¦κ°€ν•˜λŠ” λ„λ‘œμ˜ λΉ„μš© tκ°€ 주어진닀. N은 10000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , M은 30000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. tλŠ” 10μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

M개의 μ€„μ—λŠ” λ„λ‘œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ„Έ μžμ—°μˆ˜ A, B, Cκ°€ 주어진닀. A와 B사이에 λΉ„μš©μ΄ C인 λ„λ‘œκ°€ μžˆλ‹€λŠ” λœ»μ΄λ‹€. A와 BλŠ” Nμ΄ν•˜μ˜ μ„œλ‘œ λ‹€λ₯Έ μžμ—°μˆ˜μ΄λ‹€. CλŠ” 10000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

첫번째 풀이

크루슀칼 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ§„ν–‰ν–ˆμ„ λ•Œ

import sys
input = sys.stdin.readline

n,m,t = map(int,input().split())
root = [i for i in range(n+1)]
edge = [] # κ°„μ„ λ¦¬μŠ€νŠΈ

for i in range(m):
  edge.append(list(map(int,input().split())))

# λΉ„μš©μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ
edge.sort(key=lambda x:x[2])

def find(x):
  if x!=root[x]:
    root[x] = find(root[x])
  return root[x]

ans = 0
for a,b,c in edge:
  aRoot = find(a)
  bRoot = find(b)
  if aRoot != bRoot:
    if aRoot > bRoot:
      root[aRoot] = bRoot
    else:
      root[bRoot] = aRoot
    ans += c

    for j in range(m):
      edge[j][2] += t

print(ans)

되긴 λ˜λŠ”λ°.. pythonμœΌλ‘œλŠ” μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜κ³  pypy둜 ν•΄μ•Ό 겨우 ν†΅κ³Όλ˜μ—ˆλ‹€. μ™œ κ·ΈλŸ°μ§€ λ΄€λ”λ‹ˆ ν¬λ£¨μŠ€μΉΌμ€ λͺ¨λ“  경둜λ₯Ό νƒμƒ‰ν•˜λŠ”λ° λ¬Έμ œμ—μ„  ν•˜λ‚˜μ˜ 정점을 λ°©λ¬Έν–ˆλ‹€λ©΄ λ‹€μ‹œ λ°©λ¬Έν•  ν•„μš” 없도둝 ν•΄μ•Ό ν•œλ‹€. λ°©λ¬Έμ—¬λΆ€ 리슀트λ₯Ό μΆ”κ°€ν•œλ‹€ 해도 ν¬λ£¨μŠ€μΉΌμ€ μ˜λ―Έκ°€ μ—†μœΌλ‹ˆ λ‹€λ₯Έ 방법을 μ°Ύμ•„λ΄€λ‹€.

λ‘λ²ˆμ§Έ 풀이

import collections
import sys
from heapq import heappop, heappush

input = sys.stdin.readline

N,M,T = map(int,input().split())
graph = collections.defaultdict(list)
answer = 0
conquer_cost = 0

for _ in range(M):
    a,b,c = map(int,input().split())
    graph[a].append((b,c))
    graph[b].append((a,c))

visited=[False for _ in range(N+1)]
heap=[(0,1)]

while heap:
    cost,node = heappop(heap) # νž™μ—μ„œ μ΅œμ†ŒλΉ„μš© κ°„μ„  꺼냄

    if not visited[node]: # ν•΄λ‹Ή λ…Έλ“œ λ°©λ¬Έλ˜μ§€ μ•Šμ•˜λ‹€λ©΄ 방문처리
        visited[node]=True
        answer += (cost + conquer_cost)  # answer에 ν˜„μž¬ κ°„μ„  λΉ„μš©κ³Ό T의 합을 λ”ν•΄μ€Œ

        if node!=1: # 첫 번째 λ…Έλ“œ μ•„λ‹ˆλ©΄, μ •λ³΅λΉ„μš© T 증가 
            conquer_cost += T

        for next_node,next_cost in graph[node]: # λ‹€μŒ λ…Έλ“œ νƒμƒ‰ν•˜μ—¬ νž™μ— λ„£κΈ° 
            if not visited[next_node]:
                heappush(heap,(next_cost,next_node))


print(answer)

μ°Ύμ•„λ³΄λ‹ˆ ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ΄λΌλŠ” 게 μžˆμ—ˆλ‹€. ν¬λ£¨μŠ€μΉΌκ³ΌλŠ” λ‹€λ₯΄κ²Œ μ΅œμ†Œ λΉ„μš©μΈ 정점을 λ°©λ¬Έν•˜λ©΄μ„œ 직접 μ΅œμ†Œ μ‹ μž₯ 트리λ₯Ό λ§Œλ“ λ‹€. ν¬λ£¨μŠ€μΉΌμ€ 이미 μ—°κ²°λ˜μ–΄ μžˆλŠ” νŠΈλ¦¬μ—μ„œ ν•˜λ‚˜μ”© μ‚­μ œν•˜λŠ” 식이라면 프림은 λ§Œλ“€μ–΄ λ‚˜κ°€λŠ” 식이기 λ•Œλ¬Έμ— 훨씬 νš¨μœ¨μ μ΄μ—ˆλ‹€.

  1. 파이썬의 heap λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ 항상 μ΅œμ†ŒλΉ„μš©μ˜ 간선을 heappop으둜 κΊΌλ‚Ό 수 μžˆλ‹€.
  2. 정점을 λ°©λ¬Έν•  λ•Œλ§ˆλ‹€ 전체 μ •λ³΅μž λΉ„μš© λ³€μˆ˜μ— Tλ₯Ό 더해쀀닀.
  3. λͺ¨λ“  정점을 λ°©λ¬Έν–ˆλ‹€λ©΄ μ’…λ£Œν•œλ‹€.
스크란샷 2024-07-08 10 07 48

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

μ–΄λ–€ κ²½μš°μ— 크루슀칼 λ˜λŠ” 프림을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ 감을 작게 ν•˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

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

κ·Έλ ‡κ΅°μš”.. λ°©λ¬Έ 체크λ₯Ό ν•œ μ±„λ‘œ 크루슀칼둜 ν•΄κ²°ν•  수 μžˆμ„ 것 κ°™μ•„μ„œ 슬쩍 도전해보렀 ν–ˆλŠ”λ° ν¬λ£¨μŠ€μΉΌλ‘œλŠ” "μ •λ³΅ν•œ λ„μ‹œλŠ” λ‹€μ‹œ μ •λ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€" λŠ” 쑰건을 λ§Œμ‘±ν•˜κΈ° μ–΄λ ΅λ„€μš”.. ν•œ λΆ“ 그리기가 λ˜μ–΄μ•Ό ν•˜λ„€μš”
ν¬λ£¨μŠ€μΉΌμ΄λž‘ ν”„λ¦Όμ΄λž‘ λ‹€λ₯Έ μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” λΆ€λΆ„ λ°°μ›Œκ°‘λ‹ˆλ‹€ :)

ν˜Ήμ‹œ 정점 λ°˜λ³΅ν•  λ•Œλ§ˆλ‹€ 증가 λΉ„μš©μ„ μΆ”κ°€ν•˜κ³  μžˆλŠ”λ° 이 뢀뢄은 λ§ˆμ§€λ§‰μ— 정점을 λ°©λ¬Έν•  λ•Œλ§ˆλ‹€ μΆ”κ°€ν•˜μ§€ 말고 λ§ˆμ§€λ§‰μ— ν•œ λ²ˆμ— λͺ°μ•„μ„œ μΆ”κ°€ν•  수 μžˆμ§€ μ•Šμ„κΉŒμš”?

answer += T * (N-1)

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.

제일 큰 μ°¨μ΄λŠ” 간선을 λΉ„κ΅ν•˜λŠλƒ λ…Έλ“œλ₯Ό μ€‘μ μœΌλ‘œ λΉ„κ΅ν•˜λŠλƒμ˜ 차이인데 ν•΄λ‹Ή λ¬Έμ œμ—μ„œλŠ” 1λ²ˆμ—μ„œ μ‹œμž‘ν•˜λŠ” 것이기 λ•Œλ¬Έμ— λ…Έλ“œλ₯Ό μ€‘μ μœΌλ‘œ λΉ„κ΅ν•˜λŠ”κ²Œ 맞죠. 사싀 ν¬λ£¨μŠ€μΉΌλ‘œλ„ λ…Έλ“œλ₯Ό μ²΄ν¬ν•˜λ©΄μ„œ λΉ„κ΅ν•˜λŠ” 것이 κ°€λŠ₯ν•˜μ§€λ§Œ 섀계λ₯Ό μ–΄λ–»κ²Œ ν•˜λŠλƒμ— 따라 μ‹œκ°„λ³΅μž‘λ„κ°€ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λŠ˜μ–΄λ‚  μˆ˜λ„ μžˆμ„ 것 κ°™λ„€μš”.

@seongwon030
Copy link
Collaborator Author

κ·Έλ ‡κ΅°μš”.. λ°©λ¬Έ 체크λ₯Ό ν•œ μ±„λ‘œ 크루슀칼둜 ν•΄κ²°ν•  수 μžˆμ„ 것 κ°™μ•„μ„œ 슬쩍 도전해보렀 ν–ˆλŠ”λ° ν¬λ£¨μŠ€μΉΌλ‘œλŠ” "μ •λ³΅ν•œ λ„μ‹œλŠ” λ‹€μ‹œ μ •λ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€" λŠ” 쑰건을 λ§Œμ‘±ν•˜κΈ° μ–΄λ ΅λ„€μš”.. ν•œ λΆ“ 그리기가 λ˜μ–΄μ•Ό ν•˜λ„€μš” ν¬λ£¨μŠ€μΉΌμ΄λž‘ ν”„λ¦Όμ΄λž‘ λ‹€λ₯Έ μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” λΆ€λΆ„ λ°°μ›Œκ°‘λ‹ˆλ‹€ :)

ν˜Ήμ‹œ 정점 λ°˜λ³΅ν•  λ•Œλ§ˆλ‹€ 증가 λΉ„μš©μ„ μΆ”κ°€ν•˜κ³  μžˆλŠ”λ° 이 뢀뢄은 λ§ˆμ§€λ§‰μ— 정점을 λ°©λ¬Έν•  λ•Œλ§ˆλ‹€ μΆ”κ°€ν•˜μ§€ 말고 λ§ˆμ§€λ§‰μ— ν•œ λ²ˆμ— λͺ°μ•„μ„œ μΆ”κ°€ν•  수 μžˆμ§€ μ•Šμ„κΉŒμš”?

answer += T * (N-1)

흠 근데 κ²°κ΅­μ—” λ°©λ¬Έ 횟수λ₯Ό λ”ν•΄μ•Όν•˜λŠ” λ‘œμ§μ€ ν•„μš”ν•΄μ„œ λͺ°μ•„μ„œ μΆ”κ°€ν•˜λŠ” 방법이 μžˆμ„μ§€λŠ” 잘 λͺ¨λ₯΄κ² λ„€μš”. ν•œ 번 μƒκ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€ !

@seongwon030 seongwon030 merged commit 6dcfbbe into main Jul 14, 2024
1 check passed
@seongwon030 seongwon030 deleted the 18-seongwon030 branch July 14, 2024 06:02
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.

3 participants