[백준] 13265번 색칠하기

2025. 3. 30. 14:44·백준 문제/BFS

문제: 13265번: 색칠하기

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <limits>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <stack>

using namespace std;

vector<vector<int>> circles;
vector<int> colors; // 0: 미색칠, 1: 빨강, 2:파랑

bool bfs(int start) {
    queue<int> nexts;
    nexts.push(start);
    colors[start] = 1; // 1번 정점 빨강으로 시작

    while (!nexts.empty()) {
        int cur = nexts.front();
        nexts.pop();

        for (int next : circles[cur]) {
            if (colors[next] == 0) {
                // 아직 안칠한경우
                // 현재 색과 다른 색으로 칠
                colors[next] = (colors[cur] == 1 ? 2 : 1);
                nexts.push(next);
            }
            else if (colors[next] == colors[cur]) {
                return false; // 인접한데 같은 색이면 불가!!!
            }
        }
    }
    return true; // 여기까지 온거면 색칠 가능한거임
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int t;
    cin >> t;
    while (t-- > 0) {
        int n, m;
        cin >> n >> m;

        // 0번 인덱스 안써!!
        circles = vector<vector<int>>(n + 1);
        colors = vector<int>(n + 1);

        for (int i = 0; i < m; i++) {
            int x, y;
            cin >> x >> y;
            // 무방향그래프!
            circles[x].push_back(y);
            circles[y].push_back(x);
        }

        bool isPossible = true; // 색칠 가능
        for (int i = 1; i <= n; i++) {
            if (colors[i] == 0) {
                // 아직 방문하지 않은 정점이면 BFS 돌리기
                if (!bfs(i)) {
                    isPossible = false;
                    break;
                }
            }
        }
        if (isPossible) {
            cout << "possible\n";
        }
        else {
            cout << "impossible\n";
        }
    }

    return 0;
}

 

m-coloring 문제이다. 보통 2개보다 더 많은 색으로 색칠해야 하는 경우에는 백트래킹을 이용하는데 이 문제와 같이 색이 2개밖에 안 주어진 경우에는 그냥 BFS 돌리면 된다.

 

BFS 돌리다가 다음 동그라미를 색칠하려고 할 때 나랑 같은 색으로 이미 색칠된 상태라면 해당 테스트케이스는 올바르게 색칠할 수 없는 경우이다. 그래서 그냥 종료하고 impossible 출력해주면 된다.

 

m-coloring 문제는 처음 풀어봐서 신기했다.

'백준 문제/BFS' 카테고리의 다른 글
  • [백준] 29634번 Hotel
  • [백준] 21736번 헌내기는 친구가 필요해
  • [백준] 2667번 단지번호붙이기
  • [백준] 2206번 벽 부수고 이동하기
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (370) N
      • 논문 읽기 (6)
      • 백준 문제 (217) N
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (11)
        • 그리디 (25)
        • DP (26)
        • BFS (23)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (8)
        • 자료구조 (26)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (11) N
        • 재귀 (8)
        • 수학 (9)
        • 트리 (1)
      • ROS 2 공부 (1)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 학교 수업 정리 (10)
        • 컴퓨터네트워크 정리 (5)
        • 프로그래밍언어론 정리 (5)
      • 진로 (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    위상정렬
    백준
    dp
    오블완
    구현
    골드메탈
    수학
    BFS
    정렬
    그리디
    맵
    그래프
    유니티 공부 정리
    이득우
    레트로의 유니티 프로그래밍
    시뮬레이션
    재귀
    C#
    집합
    우선순위큐
    투포인터
    해시
    유니티 프로젝트
    유니티
    바킹독
    자료구조
    언리얼
    이분탐색
    티스토리챌린지
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 13265번 색칠하기
상단으로

티스토리툴바