사자와 토끼
BOJ Gold 1 이분탐색
문제링크
문제 설명
문제 풀이
처음에 BFS 로 시뮬레이션 느낌으로 구현했는데 시간초과가 났다.
문제를 푸는 과정에서 잠깐 생각했던 이분그래프 로직으로 다시 짜봤는데, 성공적으로 통과했다.
노드를 색칠한다고 생각하고, 하나의 노드를 빨간색으로 칠했다면, 그 노드와 연결되어 있는 모든 노드는 파란색으로 칠하는 로직이다.
구현
#include <iostream>
#include <vector>
#define MAXN 50005
using namespace std;
// 수풀의 수, 오솔길의 수
int N, M, res=0;
vector<vector<int>> fld(MAXN);
int visited[MAXN];
void dfs (int cur) {
if (visited[cur] == 0) {
visited[cur] = 1;
res++;
}
for (int i=0; i<fld[cur].size(); i++) {
int next = fld[cur][i];
if (visited[next] == 0) {
if (visited[cur] == 1) {
visited[next] = 2;
}
else if (visited[cur] == 2) {
visited[next] = 1;
res++;
}
dfs(next);
}
}
}
bool isBinary() {
for (int i=1; i<=N; i++) {
for (int j=0; j<fld[i].size(); j++) {
if (visited[i] == visited[fld[i][j]]) return false;
}
}
return true;
}
int main () {
ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> N >> M;
// 수풀끼리 연결
for (int i=0; i<M; i++) {
int u, v;
cin >> u >> v;
fld[u].push_back(v);
fld[v].push_back(u);
}
for (int i=1; i<=N; i++) {
visited[i] = 0;
}
for (int i=1; i<=N; i++) {
if (visited[i] == 0) dfs(i);
}
if (isBinary()) cout << res * (N-res) * 2 << "\n";
else cout << 0 << "\n";
return 0;
}
회고
이틀전에 풀이했던 문제는 시간복잡도를 처음부터 계산해 설계과정에서 시간초과가 날 지 테스트 했었는데, 이번에는 그러지 못했다.
BFS 와 DFS 시간 복잡도는 $ O(V + E) $ 이므로 다음 풀이부터는 고려해서 작성해야 할듯.
'ps' 카테고리의 다른 글
99클럽 코테스터디 19일차 TIL 조이스틱 (0) | 2024.08.09 |
---|---|
99클럽 코테스터디 18일차 TIL 일루미네이션 (0) | 2024.08.08 |
99클럽 코테스터디 16일차 TIL N-Queen (0) | 2024.08.06 |
99클럽 코테스터디 15일차 TIL 소수찾기 (0) | 2024.08.05 |
99클럽 코테스터디 14일차 TIL 징검다리 (0) | 2024.08.04 |