😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with Python]_32_μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜ 기초 문제 풀이 λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with python

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with Python]_32_μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜ 기초 문제 풀이

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 2. 13. 00:01
728x90
λ°˜μ‘ν˜•

220213 μž‘μ„±

<λ³Έ λΈ”λ‘œκ·ΈλŠ” γ€Žμ΄κ²ƒμ΄ 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€γ€ μ˜ youtubeλ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€>

https://www.youtube.com/watch?v=liuUazQaLuU&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=32 

 

 

 

 

 

 

 

 

< 문제1 > 전보

: N 개의 λ„μ‹œκ°€ μžˆλ‹€

: 각 λ„μ‹œμ˜ λ²ˆν˜Έμ™€ ν†΅λ‘œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆλŠ” 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, λ„μ‹œ C μ—μ„œ 보낸 λ©”μ‹œμ§€λ₯Ό λ°›κ²Œ λ˜λŠ” λ„μ‹œμ˜ κ°œμˆ˜λŠ” λͺ‡κ°œ, λ„μ‹œλ“€μ΄ λͺ¨λ‘ λ©”μ‹œμ§€λ₯Ό λ°›λŠ” λ°κΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ μ–Όλ§ˆμΈκ°€

 

: ν•œ λ„μ‹œμ—μ„œ λ‹€λ₯Έ λ„μ‹œκΉŒμ§€μ˜ μ΅œλ‹¨ 거리 문제둜 μΉ˜ν™˜

: μš°μ„ μˆœμœ„ 큐(HEAP)λ₯Ό μ΄μš©ν•œ λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜

 

 

 

 

  • python
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •

# λ…Έλ“œμ˜ 개수, κ°„μ„ μ˜ 개수, μ‹œμž‘ λ…Έλ“œλ₯Ό μž…λ ₯λ°›κΈ°
n, m, start = map(int, input().split())
# 각 λ…Έλ“œμ— μ—°κ²°λ˜μ–΄ μžˆλŠ” λ…Έλ“œμ— λŒ€ν•œ 정보λ₯Ό λ‹΄λŠ” 리슀트λ₯Ό λ§Œλ“€κΈ°
graph = [[] for i in range(n + 1)]
# μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λͺ¨λ‘ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
distance = [INF] * (n + 1)

# λͺ¨λ“  κ°„μ„  정보λ₯Ό μž…λ ₯λ°›κΈ°
for _ in range(m):
    x, y, z = map(int, input().split())
    # X번 λ…Έλ“œμ—μ„œ Y번 λ…Έλ“œλ‘œ κ°€λŠ” λΉ„μš©μ΄ ZλΌλŠ” 의미
    graph[x].append((y, z))

def dijkstra(start):
   q = []
   # μ‹œμž‘ λ…Έλ“œλ‘œ κ°€κΈ° μœ„ν•œ μ΅œλ‹¨ κ²½λ‘œλŠ” 0으둜 μ„€μ •ν•˜μ—¬, 큐에 μ‚½μž…
   heapq.heappush(q, (0, start))
   distance[start] = 0
   while q: # 큐가 λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄
        # κ°€μž₯ μ΅œλ‹¨ 거리가 짧은 λ…Έλ“œμ— λŒ€ν•œ 정보λ₯Ό κΊΌλ‚΄κΈ°
        dist, now = heapq.heappop(q)
        if distance[now] < dist:
            continue
        # ν˜„μž¬ λ…Έλ“œμ™€ μ—°κ²°λœ λ‹€λ₯Έ μΈμ ‘ν•œ λ…Έλ“œλ“€μ„ 확인
        for i in graph[now]:
            cost = dist + i[1]
            # ν˜„μž¬ λ…Έλ“œλ₯Ό κ±°μ³μ„œ, λ‹€λ₯Έ λ…Έλ“œλ‘œ μ΄λ™ν•˜λŠ” 거리가 더 짧은 경우
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
dijkstra(start)

# 도달할 수 μžˆλŠ” λ…Έλ“œμ˜ 개수
count = 0
# 도달할 수 μžˆλŠ” λ…Έλ“œ μ€‘μ—μ„œ, κ°€μž₯ 멀리 μžˆλŠ” λ…Έλ“œμ™€μ˜ μ΅œλ‹¨ 거리
max_distance = 0
for d in distance:
    # 도달할 수 μžˆλŠ” λ…Έλ“œμΈ 경우
    if d != 1e9:
        count += 1
        max_distance = max(max_distance, d)

# μ‹œμž‘ λ…Έλ“œλŠ” μ œμ™Έν•΄μ•Ό ν•˜λ―€λ‘œ count - 1을 좜λ ₯
print(count - 1, max_distance)

λ„μ‹œ 개수, μ‹œκ°„

  • c++
#include <bits/stdc++.h>
#define INF 1e9 // λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •

using namespace std;

// λ…Έλ“œμ˜ 개수(N), κ°„μ„ μ˜ 개수(M), μ‹œμž‘ λ…Έλ“œ 번호(Start)
int n, m, start;
// 각 λ…Έλ“œμ— μ—°κ²°λ˜μ–΄ μžˆλŠ” λ…Έλ“œμ— λŒ€ν•œ 정보λ₯Ό λ‹΄λŠ” λ°°μ—΄
vector<pair<int, int> > graph[30001];
// μ΅œλ‹¨ 거리 ν…Œμ΄λΈ” λ§Œλ“€κΈ°
int d[30001];

void dijkstra(int start) {
    priority_queue<pair<int, int> > pq;
    // μ‹œμž‘ λ…Έλ“œλ‘œ κ°€κΈ° μœ„ν•œ μ΅œλ‹¨ κ²½λ‘œλŠ” 0으둜 μ„€μ •ν•˜μ—¬, 큐에 μ‚½μž…
    pq.push({0, start});
    d[start] = 0;
    while (!pq.empty()) { // 큐가 λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄
        // κ°€μž₯ μ΅œλ‹¨ 거리가 짧은 λ…Έλ“œμ— λŒ€ν•œ 정보 κΊΌλ‚΄κΈ°
        int dist = -pq.top().first; // ν˜„μž¬ λ…Έλ“œκΉŒμ§€μ˜ λΉ„μš© 
        int now = pq.top().second; // ν˜„μž¬ λ…Έλ“œ
        pq.pop();
        // ν˜„μž¬ λ…Έλ“œκ°€ 이미 처리된 적이 μžˆλŠ” λ…Έλ“œλΌλ©΄ λ¬΄μ‹œ
        if (d[now] < dist) continue;
        // ν˜„μž¬ λ…Έλ“œμ™€ μ—°κ²°λœ λ‹€λ₯Έ μΈμ ‘ν•œ λ…Έλ“œλ“€μ„ 확인
        for (int i = 0; i < graph[now].size(); i++) {
            int cost = dist + graph[now][i].second;
            // ν˜„μž¬ λ…Έλ“œλ₯Ό κ±°μ³μ„œ, λ‹€λ₯Έ λ…Έλ“œλ‘œ μ΄λ™ν•˜λŠ” 거리가 더 짧은 경우
            if (cost < d[graph[now][i].first]) {
                d[graph[now][i].first] = cost;
                pq.push(make_pair(-cost, graph[now][i].first));
            }
        }
    }
}

int main(void) {
    cin >> n >> m >> start;

    // λͺ¨λ“  κ°„μ„  정보λ₯Ό μž…λ ₯λ°›κΈ°
    for (int i = 0; i < m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        // X번 λ…Έλ“œμ—μ„œ Y번 λ…Έλ“œλ‘œ κ°€λŠ” λΉ„μš©μ΄ ZλΌλŠ” 의미
        graph[x].push_back({y, z});
    }

    // μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λͺ¨λ‘ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
    fill(d, d + 30001, INF);
    
    // λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
    dijkstra(start);

    // 도달할 수 μžˆλŠ” λ…Έλ“œμ˜ 개수
    int count = 0;
    // 도달할 수 μžˆλŠ” λ…Έλ“œ μ€‘μ—μ„œ, κ°€μž₯ 멀리 μžˆλŠ” λ…Έλ“œμ™€μ˜ μ΅œλ‹¨ 거리
    int maxDistance = 0;
    for (int i = 1; i <= n; i++) {
        // 도달할 수 μžˆλŠ” λ…Έλ“œμΈ 경우
        if (d[i] != INF) {
            count += 1;
            maxDistance = max(maxDistance, d[i]);
        }
    }

    // μ‹œμž‘ λ…Έλ“œλŠ” μ œμ™Έν•΄μ•Ό ν•˜λ―€λ‘œ count - 1을 좜λ ₯
    cout << count - 1 << ' ' << maxDistance << '\n';
}
  • java
import java.util.*;

class Node implements Comparable<Node> {

    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return this.index;
    }

    public int getDistance() {
        return this.distance;
    }

    // 거리(λΉ„μš©)κ°€ 짧은 것이 높은 μš°μ„ μˆœμœ„λ₯Ό 가지도둝 μ„€μ •
    @Override
    public int compareTo(Node other) {
        if (this.distance < other.distance) {
            return -1;
        }
        return 1;
    }
}

public class Main {
    public static final int INF = (int) 1e9; // λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •
    // λ…Έλ“œμ˜ 개수(N), κ°„μ„ μ˜ 개수(M), μ‹œμž‘ λ…Έλ“œ 번호(Start)
    public static int n, m, start;
    // 각 λ…Έλ“œμ— μ—°κ²°λ˜μ–΄ μžˆλŠ” λ…Έλ“œμ— λŒ€ν•œ 정보λ₯Ό λ‹΄λŠ” λ°°μ—΄
    public static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
    // μ΅œλ‹¨ 거리 ν…Œμ΄λΈ” λ§Œλ“€κΈ°
    public static int[] d = new int[30001];

    public static void dijkstra(int start) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        // μ‹œμž‘ λ…Έλ“œλ‘œ κ°€κΈ° μœ„ν•œ μ΅œλ‹¨ κ²½λ‘œλŠ” 0으둜 μ„€μ •ν•˜μ—¬, 큐에 μ‚½μž…
        pq.offer(new Node(start, 0));
        d[start] = 0;
        while(!pq.isEmpty()) { // 큐가 λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄
            // κ°€μž₯ μ΅œλ‹¨ 거리가 짧은 λ…Έλ“œμ— λŒ€ν•œ 정보 κΊΌλ‚΄κΈ°
            Node node = pq.poll();
            int dist = node.getDistance(); // ν˜„μž¬ λ…Έλ“œκΉŒμ§€μ˜ λΉ„μš© 
            int now = node.getIndex(); // ν˜„μž¬ λ…Έλ“œ
            // ν˜„μž¬ λ…Έλ“œκ°€ 이미 처리된 적이 μžˆλŠ” λ…Έλ“œλΌλ©΄ λ¬΄μ‹œ
            if (d[now] < dist) continue;
            // ν˜„μž¬ λ…Έλ“œμ™€ μ—°κ²°λœ λ‹€λ₯Έ μΈμ ‘ν•œ λ…Έλ“œλ“€μ„ 확인
            for (int i = 0; i < graph.get(now).size(); i++) {
                int cost = d[now] + graph.get(now).get(i).getDistance();
                // ν˜„μž¬ λ…Έλ“œλ₯Ό κ±°μ³μ„œ, λ‹€λ₯Έ λ…Έλ“œλ‘œ μ΄λ™ν•˜λŠ” 거리가 더 짧은 경우
                if (cost < d[graph.get(now).get(i).getIndex()]) {
                    d[graph.get(now).get(i).getIndex()] = cost;
                    pq.offer(new Node(graph.get(now).get(i).getIndex(), cost));
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        start = sc.nextInt();

        // κ·Έλž˜ν”„ μ΄ˆκΈ°ν™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Node>());
        }
        
        // λͺ¨λ“  κ°„μ„  정보λ₯Ό μž…λ ₯λ°›κΈ°
        for (int i = 0; i < m; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            int z = sc.nextInt();
            // X번 λ…Έλ“œμ—μ„œ Y번 λ…Έλ“œλ‘œ κ°€λŠ” λΉ„μš©μ΄ ZλΌλŠ” 의미
            graph.get(x).add(new Node(y, z));
        }

        // μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λͺ¨λ‘ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
        Arrays.fill(d, INF);
        
        // λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
        dijkstra(start);

        // 도달할 수 μžˆλŠ” λ…Έλ“œμ˜ 개수
        int count = 0;
        // 도달할 수 μžˆλŠ” λ…Έλ“œ μ€‘μ—μ„œ, κ°€μž₯ 멀리 μžˆλŠ” λ…Έλ“œμ™€μ˜ μ΅œλ‹¨ 거리
        int maxDistance = 0;
        for (int i = 1; i <= n; i++) {
            // 도달할 수 μžˆλŠ” λ…Έλ“œμΈ 경우
            if (d[i] != INF) {
                count += 1;
                maxDistance = Math.max(maxDistance, d[i]);
            }
        }

        // μ‹œμž‘ λ…Έλ“œλŠ” μ œμ™Έν•΄μ•Ό ν•˜λ―€λ‘œ count - 1을 좜λ ₯
        System.out.println((count - 1) + " " + maxDistance);
    }
}

 

 

 

 

 

 

 

 

 

 

< 문제2 > 미래 λ„μ‹œ

: 1번 λΆ€ν„° N λ²ˆκΉŒμ§€μ˜ νšŒμ‚¬κ°€ μžˆλŠ”λ° νŠΉμ • νšŒμ‚¬λΌλ¦¬λŠ” μ„œλ‘œ λ„λ‘œλ₯Ό 톡해 μ—°κ²°

: μ—°κ²°λœ 2개의 νšŒμ‚¬λŠ” μ–‘λ°©ν–₯으둜 이동 κ°€λŠ₯

: νŒλ§€μ› AλŠ” 1번 νšŒμ‚¬μ—μ„œ μΆœλ°œν•˜μ—¬ K νšŒμ‚¬λ‘œ κ°€λŠ” μ΅œμ†Œ μ΄λ™μ‹œκ°„μ„ 좜λ ₯

 

=> μ „ν˜•μ μΈ μ΅œλ‹¨ 거리 문제

=> ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰ν›„ 1번 λ…Έλ“œμ—μ„œ X κΉŒμ§€μ˜ μ΅œλ‹¨ 거리 + X μ—μ„œ K κΉŒμ§€μ˜ μ΅œλ‹¨ 거리 κ³„μ‚°ν•˜μ—¬ 좜λ ₯

 

 

 

  • python
INF = int(1e9) # λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •

# λ…Έλ“œμ˜ 개수 및 κ°„μ„ μ˜ 개수λ₯Ό μž…λ ₯λ°›κΈ°
n, m = map(int, input().split())
# 2차원 리슀트(κ·Έλž˜ν”„ ν‘œν˜„)λ₯Ό λ§Œλ“€κ³ , λͺ¨λ“  값을 λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
graph = [[INF] * (n + 1) for _ in range(n + 1)]

# 자기 μžμ‹ μ—μ„œ 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” λΉ„μš©μ€ 0으둜 μ΄ˆκΈ°ν™”
for a in range(1, n + 1):
    for b in range(1, n + 1):
        if a == b:
            graph[a][b] = 0

# 각 간선에 λŒ€ν•œ 정보λ₯Ό μž…λ ₯ λ°›μ•„, κ·Έ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
for _ in range(m):
    # A와 Bκ°€ μ„œλ‘œμ—κ²Œ κ°€λŠ” λΉ„μš©μ€ 1이라고 μ„€μ •
    a, b = map(int, input().split())
    graph[a][b] = 1
    graph[b][a] = 1

# 거쳐 갈 λ…Έλ“œ X와 μ΅œμ’… λͺ©μ μ§€ λ…Έλ“œ Kλ₯Ό μž…λ ₯λ°›κΈ°
x, k = map(int, input().split())

# 점화식에 따라 ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
for k in range(1, n + 1):
    for a in range(1, n + 1):
        for b in range(1, n + 1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

# μˆ˜ν–‰λœ κ²°κ³Όλ₯Ό 좜λ ₯
distance = graph[1][k] + graph[k][x]

# 도달할 수 μ—†λŠ” 경우, -1을 좜λ ₯
if distance >= 1e9:
    print("-1")
# 도달할 수 μžˆλ‹€λ©΄, μ΅œλ‹¨ 거리λ₯Ό 좜λ ₯
else:
    print(distance)

  • c++
#include <bits/stdc++.h>
#define INF 1e9 // λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •

using namespace std;

// λ…Έλ“œμ˜ 개수(N), κ°„μ„ μ˜ 개수(M)
int n, m;
// 2차원 λ°°μ—΄(κ·Έλž˜ν”„ ν‘œν˜„)λ₯Ό λ§Œλ“€κΈ°
int graph[101][101];

int main(void) {
    cin >> n >> m;

    // μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λͺ¨λ‘ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
    for (int i = 0; i < 101; i++) {
        fill(graph[i], graph[i] + 101, INF);
    }

    // 자기 μžμ‹ μ—μ„œ 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” λΉ„μš©μ€ 0으둜 μ΄ˆκΈ°ν™”
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= n; b++) {
            if (a == b) graph[a][b] = 0;
        }
    }

    // 각 간선에 λŒ€ν•œ 정보λ₯Ό μž…λ ₯ λ°›μ•„, κ·Έ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
    for (int i = 0; i < m; i++) {
        // A와 Bκ°€ μ„œλ‘œμ—κ²Œ κ°€λŠ” λΉ„μš©μ€ 1이라고 μ„€μ •
        int a, b;
        cin >> a >> b;
        graph[a][b] = 1;
        graph[b][a] = 1;
    }

    // 거쳐 갈 λ…Έλ“œ X와 μ΅œμ’… λͺ©μ μ§€ λ…Έλ“œ Kλ₯Ό μž…λ ₯λ°›κΈ°
    int x, k;
    cin >> x >> k;

    // 점화식에 따라 ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
    for (int k = 1; k <= n; k++) {
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]);
            }
        }
    }

    // μˆ˜ν–‰λœ κ²°κ³Όλ₯Ό 좜λ ₯
    int distance = graph[1][k] + graph[k][x];

    // 도달할 수 μ—†λŠ” 경우, -1을 좜λ ₯
    if (distance >= INF) {
        cout << "-1" << '\n';
    }
    // 도달할 수 μžˆλ‹€λ©΄, μ΅œλ‹¨ 거리λ₯Ό 좜λ ₯
    else {
        cout << distance << '\n';
    }
}
  • java
import java.util.*;

public class Main {

    public static final int INF = (int) 1e9; // λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •
    // λ…Έλ“œμ˜ 개수(N), κ°„μ„ μ˜ 개수(M), 거쳐 갈 λ…Έλ“œ(X), μ΅œμ’… λͺ©μ μ§€ λ…Έλ“œ(K)
    public static int n, m, x, k;
    // 2차원 λ°°μ—΄(κ·Έλž˜ν”„ ν‘œν˜„)λ₯Ό λ§Œλ“€κΈ°
    public static int[][] graph = new int[101][101];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();

        // μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λͺ¨λ‘ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
        for (int i = 0; i < 101; i++) {
            Arrays.fill(graph[i], INF);
        }

        // 자기 μžμ‹ μ—μ„œ 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” λΉ„μš©μ€ 0으둜 μ΄ˆκΈ°ν™”
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (a == b) graph[a][b] = 0;
            }
        }

        // 각 간선에 λŒ€ν•œ 정보λ₯Ό μž…λ ₯ λ°›μ•„, κ·Έ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
        for (int i = 0; i < m; i++) {
            // A와 Bκ°€ μ„œλ‘œμ—κ²Œ κ°€λŠ” λΉ„μš©μ€ 1이라고 μ„€μ •
            int a = sc.nextInt();
            int b = sc.nextInt();
            graph[a][b] = 1;
            graph[b][a] = 1;
        }

        x = sc.nextInt();
        k = sc.nextInt();

        // 점화식에 따라 ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
        for (int k = 1; k <= n; k++) {
            for (int a = 1; a <= n; a++) {
                for (int b = 1; b <= n; b++) {
                    graph[a][b] = Math.min(graph[a][b], graph[a][k] + graph[k][b]);
                }
            }
        }

        // μˆ˜ν–‰λœ κ²°κ³Όλ₯Ό 좜λ ₯
        int distance = graph[1][k] + graph[k][x];

        // 도달할 수 μ—†λŠ” 경우, -1을 좜λ ₯
        if (distance >= INF) {
            System.out.println(-1);
        }
        // 도달할 수 μžˆλ‹€λ©΄, μ΅œλ‹¨ 거리λ₯Ό 좜λ ₯
        else {
            System.out.println(distance);
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

728x90
λ°˜μ‘ν˜•
Comments