๋์ด๋ : ๊ณจ๋ 4
๊ฑธ๋ฆฐ ์๊ฐ : ์ค๋ ๊ฑธ๋ฆผ
๋ฌธ์
์ด๋ถ ๊ทธ๋ํ ๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๊ทธ๋ํ์ ์ ์ ์ ์งํฉ์ ๋๋ก ๋ถํ ํ์ฌ, ๊ฐ ์งํฉ์ ์ํ ์ ์ ๋ผ๋ฆฌ๋ ์๋ก ์ธ์ ํ์ง ์๋๋ก ๋ถํ ํ ์ ์์ ๋, ๊ทธ๋ฌํ ๊ทธ๋ํ๋ฅผ ํน๋ณํ ์ด๋ถ ๊ทธ๋ํ (Bipartite Graph) ๋ผ ๋ถ๋ฅธ๋ค.
๊ทธ๋ํ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ก์ ๋, ์ด ๊ทธ๋ํ๊ฐ ์ด๋ถ ๊ทธ๋ํ์ธ์ง ์๋์ง ํ๋ณํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํ์ด
- bfs๋ก ์ํํ๋ฉด์ ๋ ๊ฐ์ง ์์ผ๋ก ์น ํ๊ธฐ (1, -1)
- ์ด๋ฏธ ์น ํด์ง ๊ณณ์ด ๋ค๋ฅธ ์์ผ๋ก ์น ํด์ ธ์ผ ํ๋ค๋ฉด ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋
์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
#include <string>
using namespace std;
vector<int> vec[20001];
bool bfs(vector<int>& check, int start) {
queue<int> que;
que.push(start);
while (!que.empty()) {
int tmp = que.front(); que.pop();
int comp = check[tmp]; // ๋น๊ต ๊ฐ
for (int i = 0; i < vec[tmp].size(); i++) {
int tmp2 = vec[tmp][i];
if (check[tmp2] == comp) {
// ์ด๋ถ ๊ทธ๋ํ x
return false;
}
if (check[tmp2] != 0)
// ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ
continue;
check[tmp2] = comp * (-1);
que.push(tmp2);
}
}
return true;
}
int main() {
// r,b ์์น ํ๊ธฐ
// ๊ทธ๋ํ ํํ ( ์ฐ๊ฒฐ ๋ฆฌ์คํธ )
// bfs๋ก ๋๋ฉด์ ์ ๊ฒน์น๋ฉด no
int K; cin >> K;
vector<string> answer;
while (K--) {
int V, E; cin >> V >> E;
for (int i = 1; i <= V; i++) {
vec[i].clear();
}
for (int i = 0; i < E; i++) {
int s, e; cin >> s >> e;
vec[s].push_back(e);
vec[e].push_back(s);
}
vector<int> check(V + 1, 0);
int flag = false;
for (int i = 1; i <= V; i++) {
if (check[i] != 0) // ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ์ ๋ค์ ๋ณด์ง x
continue;
else
check[i] = 1; // ๋ค๋ฅด์ง ์์ ๊ณณ์ 1๋ก ์์
if (!bfs(check, i)) {
answer.push_back("NO");
flag = true;
break;
}
}
if (!flag)
answer.push_back("YES");
}
for (int i = 0; i < answer.size(); i++) {
cout << answer[i] << '\n';
}
}
๊ฒฐ๊ณผ
๋ฐ์ํ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 2146 :: ๋ค๋ฆฌ ๋ง๋ค๊ธฐ (0) | 2021.05.18 |
---|---|
[c++] BOJ 2589 :: ๋ณด๋ฌผ์ฌ (0) | 2021.05.18 |
[c++] BOJ 2206 :: ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2021.05.11 |
[c++] BOJ 16236 :: ์๊ธฐ ์์ด (0) | 2021.05.03 |
[c++] BOJ 1987 :: ์ํ๋ฒณ (0) | 2021.04.28 |
Comment