1707번: 이분 그래프
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수
www.acmicpc.net
처음엔 그냥 두 개의 벡터를 만들어서 나누는 식으로 구현을 하려 했지만 실패했고 결국 답을 볼 수 밖에 없었다.
1. 큐와 간선 그래프 등을 포함해 모든 것을 테스트 케이스마다 초기화 해주기
2. 연결 그래프가 아닐 수도 있다는 것
이 두가지가 중요한 문제였다고 생각한다.
결국 푼 방법은 0, 1, 2 세가지의 종류로 정점들을 나눴고 이를 활용해서 풀 수 있었다.
백준 1707번: 이분 그래프 (C++)
https://www.acmicpc.net/problem/1707 가령 1--2--3--4 이러한 연결 관계를 가지는 그래프가 주어지면, 1을 빨간색, 2를 초록색으로 칠하고, 다시 3을 빨간색 4를 초록색 이렇게 두 가지의 색을 이용하여, 그래
hugssy.tistory.com
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
bool c = true;
int k, v, e;
queue<int> q;
vector<int> edges[20001];
int visit[20001];
void bfs(int x) {
q.push(x);
visit[x] = 1;
while (!q.empty()) {
int y = q.front();
q.pop();
for (int i = 0; i < edges[y].size(); i++) {
int z = edges[y][i];
if (visit[z] != 0 && visit[y] == visit[z]) {
c = false;
return;
}
if (visit[z] > 0) {
continue;
}
q.push(z);
visit[z] = visit[y] % 2 + 1;
}
}
}
int main() {
int a, b;
cin >> k;
while (k--) {
cin >> v >> e;
for (int i = 0; i < e; i++) {
cin >> a >> b;
edges[a].push_back(b);
edges[b].push_back(a);
}
for (int i = 1; i <= v; i++) {
if (visit[i] == 0) {
bfs(i);
}
if (!c) {
cout << "NO" << "\n";
break;
}
}
if (c) {
cout << "YES" << "\n";
}
while (!q.empty()) {
q.pop();
}
for (int i = 1; i <= v; i++) {
visit[i] = 0;
edges[i].clear();
}
c = true;
}
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 14716번: 현수막 (0) | 2020.11.26 |
---|---|
[C++] 백준 13549번: 숨바꼭질 3 (0) | 2020.11.25 |
[C++] 백준 1759번: 암호 만들기 (0) | 2020.11.10 |
[C++] 백준 1916번: 최소비용 구하기 (0) | 2020.11.09 |
[C++] 백준 1107번: 리모컨 (0) | 2020.11.05 |