[DFS] 백준 1707번: 이분 그래프(Swift)

2022. 11. 11. 21:31·코테

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

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에

www.acmicpc.net

난이도: 골드 4
사용언어: Swift
카테코리: DFS
풀이과정

1707번 문제의 주제는 이분 그래프이다.

이분 그래프란, 

위 그림과 같이 각 집합의 정점을 두 분류로 나눌 수 있는 그래프가 이분 그래프이다.

1번 예제 같은 경우, 

위와 같이 표현할 수 있기 때문에, 이분 그래프라고 할 수 있다. 하지만, 2번 예제 같은 경우

2와 4가 한 분류로 묶이기 때문에 이분 그래프가 될 수 없다.

위 처럼, 색으로 나눠볼 수 있기 때문에 문제에서 

0, 1로 두 분류로 나눴으며, 탐색하지 않은 노드는 -1로 표시하였다.

code
struct Queue<T> {
  var memory = [T]()
  var index = 0
  
  var isEmpty: Bool {
    memory.count < index + 1
  }
  
  mutating func inQueue(element: T) {
    memory.append(element)
  }
  
  mutating func deQueue() -> T {
    let v = memory[index]
    index += 1
    return v
  }
}

let k = Int(readLine()!)!
var results = [String]()
for _ in 0..<k {
  let ve = readLine()!.split(separator: " ").map { Int($0)! }
  let v = ve[0]
  let e = ve[1]

  var links: [[Int]] = Array(repeating: [], count: v + 1)
  var nodeColors = Array(repeating: -1, count: v + 1)

  for _ in 0..<e {
    let v = readLine()!.split(separator: " ").map { Int($0)! }
    links[v[0]].append(v[1])
    links[v[1]].append(v[0])
  }

  var q = Queue<Int>()
  var result = "YES"
  
  func bfs(start: Int) {
    nodeColors[start] = 0
    q.inQueue(element: start)
    while !q.isEmpty {
      let c = q.deQueue()
      for i in links[c] {
        if nodeColors[i] == -1 {
          nodeColors[i] = nodeColors[c]^1
          q.inQueue(element: i)
        } else if nodeColors[i] == nodeColors[c] {
          result = "NO"
          return
        }
      }
    }
  }
  
  for i in 1...v {
    if nodeColors[i] == -1 {
      bfs(start: i)
      if result == "NO" { break }
    }
  }
  results.append(result)
}

results.forEach {
  print($0)
}

'코테' 카테고리의 다른 글

[DFS] 백준 1068번: 트리(Swift)  (0) 2022.11.18
[BFS + 구현] 백준 2573번: 빙산  (0) 2022.11.14
[DFS + DP] 백준 1520번: 내리막길(Swift)  (0) 2022.11.11
[DFS] 백준 2644번: 촌수계산(Swift)  (0) 2022.11.09
[BFS] 백준: 영역 구하기(Swift)  (0) 2022.11.08
'코테' 카테고리의 다른 글
  • [DFS] 백준 1068번: 트리(Swift)
  • [BFS + 구현] 백준 2573번: 빙산
  • [DFS + DP] 백준 1520번: 내리막길(Swift)
  • [DFS] 백준 2644번: 촌수계산(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    브루트포스 알고리즘
    Swift
    Race Condition
    알고리즘
    노드
    비동기
    재귀
    코테
    Property wrapper
    구현
    실버
    ios
    이분탐색
    챌린지
    Combine
    BFS
    탐색
    완전탐색
    그리디
    다이나믹 프로그래밍
    dfs
    photos
    회고
    photoUI
    PhotoKit
    네부캠
    동시성
    GCD
    코딩테스트
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[DFS] 백준 1707번: 이분 그래프(Swift)
상단으로

티스토리툴바