Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1707. ์ด๋ถ„๊ทธ๋ž˜ํ”„ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1707. ์ด๋ถ„๊ทธ๋ž˜ํ”„

bba_dda 2021. 5. 12. 19:27
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

www.acmicpc.net/problem/1707

ํ’€์ด

 ์ฒ˜์Œ์—๋Š”, ๋ฒกํ„ฐ ๋‘๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฐ ๊ทธ๋ฃน์— ๋…ธ๋“œ๋“ค์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ํ˜•์‹์œผ๋กœ ํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค.
๊ทธ๋ž˜ํ”„๊ฐ€ ๊ผญ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์˜ case2์™€ ๊ฐ™์ด ๋…๋ฆฝ์ ์ธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๊ทธ๋ž˜์„œ ์–Œ์ „ํ•˜๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ทธ๋ž˜ํ”„ ํ’€์ด ๋ฐฉ์‹์„ ์ด์šฉํ•˜์˜€๋‹ค.
BFS๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ํ›„์—, ํ•ด๋‹น ๊ทธ๋ž˜ํ”„๊ฐ€ ์ด๋ถ„๊ทธ๋ž˜ํ”„์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค๋‹ค.

๊ฐ„์„ ์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ, v1 -> v2๋งŒ ์ €์žฅํ•ด์„œ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๊ฐ€ ๋‚˜์™”๋‹ค. 

๋ฌด๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์—, v2 -> v1๋„ ์ €์žฅํ•ด์•ผํ•œ๋‹ค! 

 

๊ทธ๋ฆฌ๊ณ  BFS๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ ๊นŒ์ง€ ์—ฌ๋Ÿฌ๋ฒˆ ๋Œ๋ ค์•ผํ–ˆ๋‹ค. 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

#define LEFT 1
#define RIGHT 2

vector<int> graph[200001];
int visited[200001] = {0,};

void BFS(int start){
    queue<int> q;
    q.push(start);
    int flag = LEFT;
    visited[start] = flag; 

    while(!q.empty()){
        int now = q.front();
        q.pop();
        flag = visited[now];
        int nextFlag = LEFT; 
        if (flag == LEFT) nextFlag = RIGHT;
        for (int i=0;i<graph[now].size();i++){
            int next = graph[now][i];

            if (visited[next] == 0){
                q.push(next);
                visited[next] = nextFlag;
            }
        }
    }
}

bool isBipartite(int V) {
    for (int i=0; i<V; i++){
        for (int j=0; j<graph[i].size(); j++){
            if (visited[i] == visited[graph[i][j]])
                return 0;
        }
    }
    return 1;
}
int main(void){
    int T;
    cin >> T;
    for (int t=0;t<T;t++){
        int V,E;
        cin >> V >> E;
        for (int e=0;e<E;e++){
            int a,b;
            cin >> a >> b;
            graph[a-1].push_back(b-1);
            graph[b-1].push_back(a-1); //๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ !!!
        }
        // ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ 
        // BFS(0);
        for (int i = 0; i < V; i++) { 
            if (visited[i] == 0) { // ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                BFS(i);
            } 
        }
        // ์ด๋ถ„๊ทธ๋ž˜ํ”„ ์—ฌ๋ถ€ ํ™•์ธ 
        bool result = isBipartite(V);

        //๊ฒฐ๊ณผ ์ถœ๋ ฅ 
        if (result) 
            cout << "YES" << endl;
        else   
            cout << "NO" << endl;

        // ์ดˆ๊ธฐํ™” 
        for (int i=0;i<V;i++){
            graph[i].clear();
        }
        fill(&visited[0],&visited[200001],0);

    }
}

๊ฒฐ๊ณผ

์ฐธ๊ณ 

jdselectron.tistory.com/51

๋ฐ˜์‘ํ˜•