[백준] 13265번 색칠하기 (C++)

2025. 8. 29. 18:15·Algorithm
728x90

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

 

 

이 문제는 동그라미 개수, 그래프의 상관관계가 주어질때 2개의 색만을 사용하여 인접한 동그라미는 다르게 칠하여 2개의 색으로만 색칠할 수 있는지를 묻는 문제이다.

 

2개의 색만을 사용하여 그래프를 칠할 수 있는지 -> 이분그래프

 

즉 이분그래프인지 아닌지만 판별하면되는 문제이다.

 

 

따라서 dfs, bfs를 사용하여 구현할 수 있으므로 bfs를 사용하여 풀어보았다.

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

struct nutrition {
    int p;
    int f;
    int s;
    int v;
    int cost;
};

int dx[] = {0 ,0, -1, 0, 1, 1, -1, -1, 1};
int dy[] = {0, -1, 0, 1, 0, -1, 1, -1, 1};
int T, N, M;
int visited[1001];
vector<vector<int>> v(1001);

bool bfs(int n) {        // 색깔 1, 2 사용
    queue<pii> q;
    q.push({n, 1});
    visited[n] = 1;

    while(!q.empty()) {
        int Node = q.front().first;
        int Color = q.front().second;
        q.pop();

        for(auto it : v[Node]) {
            int NextNode = it;

            if(Color == 1) {
                if(!visited[NextNode]) {        // 색깔이 칠해지지 않았을 때
                    q.push({NextNode, 2});
                    visited[NextNode] = 2;
                }
                else {
                    if(visited[NextNode] == 1) {
                        return false;
                    }
                }
            }
            else if(Color == 2) {
                if(!visited[NextNode]) {
                    q.push({NextNode, 1});
                    visited[NextNode] = 1;
                }
                else {
                    if(visited[NextNode] == 2) {
                        return false;
                    }
                }
            }
        }
    }

    return true;
}

void solve() {
    bool check = false;
    for(int i = 1; i <= N; i++) {
        if(!visited[i]) {
            if(!bfs(i)) {
                check = true;
            }
        }
    }

    if(!check) {
        cout << "possible" << endl;
    }
    else cout << "impossible" << endl;
}

void input() {
    cin >> T;

    while(T--) {
        cin >> N >> M;

        memset(visited, 0, sizeof(visited));
        v.clear();
        v.resize(N+1);

        for(int i = 0; i < M; i++) {
            int a, b;
            cin >> a >> b;
            v[a].push_back(b);
            v[b].push_back(a);
        }

        solve();
    }
}

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

    input();
}

 

코드를 하나씩 살펴보면

 

bool bfs(int n) {        // 색깔 1, 2 사용
    queue<pii> q;
    q.push({n, 1});
    visited[n] = 1;

    while(!q.empty()) {
        int Node = q.front().first;
        int Color = q.front().second;
        q.pop();

        for(auto it : v[Node]) {
            int NextNode = it;

            if(Color == 1) {
                if(!visited[NextNode]) {        // 색깔이 칠해지지 않았을 때
                    q.push({NextNode, 2});
                    visited[NextNode] = 2;
                }
                else {
                    if(visited[NextNode] == 1) {
                        return false;
                    }
                }
            }
            else if(Color == 2) {
                if(!visited[NextNode]) {
                    q.push({NextNode, 1});
                    visited[NextNode] = 1;
                }
                else {
                    if(visited[NextNode] == 2) {
                        return false;
                    }
                }
            }
        }
    }

    return true;
}

 

가장 핵심코드인 bfs 함수이며 1번 노드를 큐에넣으며 visited[1]을 1로 만들어 1로 색칠했다는것 나타내기 위해서

저렇게 만들었다.

 

큐에 하나씩 빼면서 그와 인접한 노드들을 탐색하여 현재 노드의 색칠한것과 비교하여 다른색으로 칠해주며 만약 이미 색칠해져있으며 같은색으로 색칠한경우는 이분그래프가 될 수 없기 때문에 false를 반환해주었다.

 

만약 끝까지 탐색했을때 이를 위배하지 않는경우 이분그래프라고 판단하였다.

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 23326번 홍익 투어리스트 (C++)  (0) 2025.08.31
[백준] 14395번 4연산 (C++)  (0) 2025.08.30
[백준] 14620번 꽃길 (C++)  (0) 2025.08.28
[백준] 25381번 ABBC (C++)  (0) 2025.08.27
[백준] 1068번 트리 (C++)  (0) 2025.08.26
'Algorithm' 카테고리의 다른 글
  • [백준] 23326번 홍익 투어리스트 (C++)
  • [백준] 14395번 4연산 (C++)
  • [백준] 14620번 꽃길 (C++)
  • [백준] 25381번 ABBC (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (285) N
      • Programming (52) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (8) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Leviathan
    BFS
    코딩
    백준
    다익스트라
    브루트포스
    우선순위 큐
    누적합
    Bandit
    wargame
    이분탐색
    에라토스테네스의 체
    구현
    c언어
    투포인터
    다이나믹 프로그래밍
    우선순위큐
    DFS
    linux
    WebSecurity
    트리
    비트마스킹
    DP
    그래프 이론
    백트래킹
    재귀
    그리디
    깊이우선탐색
    정렬
    시뮬레이션
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 13265번 색칠하기 (C++)
상단으로

티스토리툴바