ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1922 네트워크 연결
    Algorithm/BOJ 2021. 4. 30. 17:04
    728x90

    출처: www.acmicpc.net/problem/1922

    분류: kruskal


    접근방식

    최소 비용으로 모든 간선을 연결할 수 있는 경우를 찾는 크루스칼 알고리즘을 연습해볼 수 있는 문제였습니다.

    별다른 트릭은 없어서 크루스칼 알고리즘을 이해하고 있다면 쉽게 해결할 수 있습니다.

    간선을 정렬하고 사이클이 생기지 않도록 합쳐주면서 간선의 개수를 노드-1개까지 선택해주면 됩니다.

    사이클은 union-find 알고리즘으로 확인할 수 있습니다.

     

    해결방법

    let n = Int(readLine()!)!
    var graph = [[Int]](repeating: [Int](repeating: 10001, count: n+1), count: n+1)
    var unionTable = [Int]()
    
    for i in 0...n {
        unionTable.append(i)
    }
    
    typealias Edge = (a: Int, b: Int, cost: Int)
    var edges = [Edge]()
    
    for _ in 0..<Int(readLine()!)! {
        let edge = readLine()!.split(separator: " ").map { Int(String($0))! }
        edges.append(Edge((edge[0], edge[1], edge[2])))
    }
    
    func find(of idx: Int) -> Int {
        guard unionTable[idx] != idx else { return idx }
        unionTable[idx] = find(of: unionTable[idx])
        return unionTable[idx]
    }
    
    func union(_ a: Int, _ b: Int) {
        let aParents = find(of: a)
        let bParents = find(of: b)
        
        if aParents < bParents {
            unionTable[bParents] = aParents
        } else {
            unionTable[aParents] = bParents
        }
    }
    
    edges.sort(by: { $0.cost < $1.cost })
    var connectEdges = 0
    var connectCost = 0
    for (a, b, cost) in edges {
        guard connectEdges < n else { break }
        let aParents = find(of: a)
        let bParents = find(of: b)
        
        if aParents == bParents {
            continue
        } else {
            union(a, b)
            connectEdges += 1
            connectCost += cost
        }
    }
    
    print(connectCost)
    

     

     

    배운점

     

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 2473 세 용액  (0) 2021.05.03
    백준 14719 빗물  (0) 2021.05.02
    백준 1981 후위 표기식  (0) 2021.04.26
    백준 2493 탑  (0) 2021.04.22
    백준 1958 LCS 3  (0) 2021.04.22

    댓글

Designed by Tistory.