๐์ด๋ถ ๊ทธ๋ํ๋ ?
์ธ์ ํ ์ ์ ๋ผ๋ฆฌ ์๋ก ๋ค๋ฅธ ์์ผ๋ก ์น ํด์ ๋ชจ๋ ์ ์ ์ ๋๊ฐ์ง ์์ผ๋ก๋ง ์น ํ ์ ์๋ ๊ทธ๋ํ
๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ด ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ง๊ณ ์๋ก ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ ์ ์ด ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์ ธ ์๋ ๊ทธ๋ํ
โฟ์ด๋ถ ๊ทธ๋ํ ํน์ง
- ์ด๋ถ ๊ทธ๋ํ์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ BFS, DFS ํ์์ ์ด์ฉํ๋ฉด ๋๋ค.
- ์ด๋ถ ๊ทธ๋ํ๋ BFS๋ฅผ ํ ๋ ๊ฐ์ ๋ ๋ฒจ์ ์ ์ ๋ผ๋ฆฌ๋ ๋ฌด์กฐ๊ฑด ๊ฐ์ ์์ผ๋ก ์น ํด์ง๋ค.
- ์ฐ๊ฒฐ ์ฑ๋ถ์ ๊ฐ์(Connected Component)๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ฉฐ ๊ฐ์ ์ ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ O(V+E)๋ก ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ๋ค.
โ๏ธ์ด๋ถ ๊ทธ๋ํ ํ๋ณ ์๊ณ ๋ฆฌ์ฆ
- ์๋ก ์ธ์ ํ ์ ์ ์ด ๊ฐ์ ์์ด๋ฉด ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋๋ค.
- BFS, DFS ๋ก ํ์ํ๋ฉด์ ์ ์ ๋ฐฉ๋ฌธ ํ ๋๋ง๋ค ๋๊ฐ์ง ์ ์ค ํ๋๋ฅผ ์น ํ๋ค.
- ๋ค์ ์ ์ ๋ฐฉ๋ฌธํ๋ฉด์ ์์ ๊ณผ ์ธ์ ํ ์ ์ ์ ์์ ๊ณผ ๋ค๋ฅธ ์์ผ๋ก ์น ํ๋ค.
- ํ์ ์งํ ํ ๋ ์์ ๊ณผ ์ธ์ ํ ์ ์ ์ ์์ด ์์ ๊ณผ ๋์ผํ๋ฉด ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋๋ค.
- BFS์ ๊ฒฝ์ฐ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค๊ฐ ๋ง์ฝ ๊ฐ์ ๋ ๋ฒจ์์ ์ ์ ์ ๋ค๋ฅธ ์์ผ๋ก ์น ํด์ผ ํ๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋๋ค.
- ๋ชจ๋ ์ ์ ๋ค ๋ฐฉ๋ฌธํ๋๋ฐ ์์ ๊ฐ์ ๊ฒฝ์ฐ ์๋ค๋ฉด ์ด๋ถ ๊ทธ๋ํ๋ค
- ์ฐ๊ฒฐ ๊ทธ๋ํ์ ๋น์ฐ๊ฒฐ ๊ทธ๋ํ ๋ ๋ค ๊ณ ๋ คํด์ผ ํ๋ค.
- ๊ทธ๋ํ๊ฐ ๋น์ฐ๊ฒฐ ๊ทธ๋ํ์ธ๊ฒฝ์ฐ ๋ชจ๋ ์ ์ ์ ๋ํด ํ์ธํ๋ ์์ ์ด ํ์ํ๋ค.
c++ ์ฝ๋
//
// 1707_bgd.cpp
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2021/02/25.
//
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
enum color { RED, BLUE };
vector<int> RED_GROUP;
vector<int> BLUE_GROUP;
string res = "";
int visit[20001];
vector<int> map[20001];
int cnt = 0;
int v, e;
void dfs(int vertex, int color){
visit[vertex] = color;
if(color == RED){
RED_GROUP.push_back(vertex);
}else if(color == BLUE){
BLUE_GROUP.push_back(vertex);
}
cnt++;
//cout << "m : " << map[vertex].size() << " " << endl;
if(cnt == v) return; // vertex ๋ค ๋๋ฉด ์ข
๋ฃ
for(int i = 0; i < (int)map[vertex].size(); i++){
//cout << map[vertex][i] << " " << endl;
if(visit[map[vertex][i]] == -1){
dfs(map[vertex][i], (color + 1) % 2);
}
if(visit[map[vertex][i]] == color){
res = "NO";
return;
}
}
}
int main(){
cin >> v >> e; // vertex, edge
memset(visit, -1, sizeof(visit));
//fill(map.begin(), map.begin() + 20001, -1);
res = "YES";
for(int i = 0; i < e; i++){
int v1, v2;
cin >> v1 >> v2;
map[v1].push_back(v2);
map[v2].push_back(v1);
}
for(int j = 1; j <= v; j++){
if(visit[j] == -1){ // ๋ฐฉ๋ฌธ ํ์ง x์ผ๋ฏ๋ก
dfs(j, RED);
}
}
cout << "์ด๋ถ ๊ทธ๋ํ ์ฌ๋ถ " << res << endl;
if (!res.compare("YES")) {
cout << "RED GROUP : ";
for (int i = 0; i < (int)RED_GROUP.size(); i++) {
cout << RED_GROUP[i] << " ";
}
cout << "\nBLUE GROUP : ";
for (int i = 0; i < (int)BLUE_GROUP.size(); i++) {
cout << BLUE_GROUP[i] << " ";
}
cout << endl;
}
return 0;
}
'Data Structure๐งถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ ์ ๋ ฌ Topological Sort (0) | 2021.06.13 |
---|---|
๊ทธ๋ํ ์ด๋ก - DFS์ BFS (0) | 2021.04.21 |
LCS ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด DP (0) | 2021.03.01 |
์ ๋ ฌ - ์ ํ, ๋ฒ๋ธ, ์ฝ์ , ๋ณํฉ, ํ, ํต (0) | 2021.02.19 |
๋๊ธ