티스토리 뷰

반응형

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

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수

www.acmicpc.net

 

이분 그래프의 설명을 이해하기 어려워서 위키백과를 참고했습니다

 

  • 문제 해결 방법

노드를 탐색할때 1과 0이 번갈아 나타나도록 방문처리를 해주면서 탐색도중 같은 방문값이 연속적으로 나타난다면 NO를 출력하고 그렇지 않으면 YES를 출력하도록 했습니다.

 

입력되는 데이터 중 연결되지 않은 집합이 존재할 수 있으므로 모든 노드의 방문을 확인해 주어야 합니다.

 

 

 

 

  • C++ 전체 코드
#include<bits/stdc++.h>
using namespace std;

int T,N,K;
vector<int> adj[20001]{};
int vi[20001]{};

bool bfs(int st){
    queue<int> q;
    q.push(st);
    vi[st] = 0;
    while(!q.empty()){
        int now = q.front();
        q.pop();

        for(auto next : adj[now]){
            if(vi[next] == vi[now]) return false;
            if(vi[next] == -1) {
                vi[next] = !vi[now];
                q.push(next);
            }
        }
    }
    return true;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int a,b;
    cin>>T;
    while(T--){
        cin>>N>>K;
        memset(vi,-1,sizeof(vi));
        for(int i=0; i<=N; i++) adj[i].clear();
        for(int i=0; i<K; i++){
            cin>>a>>b;
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        
        bool chk = true;
        for(int i=1; i<=N; i++) {
            if(vi[i] != -1) continue;
            if(!bfs(i)) {
                chk = false;
                break;
            }
        }
        if(chk) cout<<"YES"<<'\n';
        else cout<<"NO"<<'\n';
    }
}

 

 

반응형

'알고리즘 공부 > 문제풀이' 카테고리의 다른 글

백준 2342번 - Dance Dance Revolution  (0) 2021.05.31
백준 15957번 - 음악 추천  (4) 2021.05.29
백준 12746번 - Traffic (Large)  (0) 2021.05.28
백준 11960번 - Max Flow  (0) 2021.05.28
백준 5916번 - 농장 관리  (3) 2021.05.28
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함