https://www.acmicpc.net/problem/1707


케이스에따라 그래프를 입력받고 DFS 방식으로 그래프를 순회하면서 노드마다 다른 집합에 저장하고 순회 중에
시작 노드와 같은 집합인 vertex가 있으면 사이클이 생기기 때문에 이분 그래프가 안되는 것이다.
정답코드
#include <iostream>
#include <vector>
using namespace std;
void DFS(int node);
vector<vector<int>> graph;
vector<int> check;
vector<bool> visited;
bool isEven;
int main()
{
int k;
cin >> k;
for (int i = 0; i < k; i++)
{
int v, e;
cin >> v >> e;
//초기설정
graph.resize(v + 1);
check.resize(v + 1);
visited.resize(v + 1);
isEven = true;
//그래프 입력받기
for (int i = 0; i < e; i++)
{
int start, end;
cin >> start >> end;
graph[start].push_back(end);
graph[end].push_back(start);
}
//그래프 전체 순회(DFS)
for (int i = 1; i <= v; i++)
{
if (isEven)
{
DFS(i);
}
else
{
break;
}
}
if (isEven)
{
cout << "YES" << "\n";
}
else
{
cout << "NO" << "\n";
}
//다시 기본값으로 초기화
for (int i = 0; i <= v; i++)
{
graph[i].clear();
visited[i] = false;
check[i] = 0;
}
}
}
void DFS(int node)
{
//방문처리
visited[node] = true;
//연결되어있는 노드탐색
for (int i : graph[node])
{
//방문하지 않았다면
if (!visited[i])
{
//다른 집합에 추가
check[i] = (check[node] + 1) % 2;
DFS(i);
}
//방문했고 만약 같은 집합이라면 사이클 발생
else if (check[node] == check[i]) isEven = false;
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]1753번. 최단경로 (0) | 2024.10.24 |
---|---|
[백준][C++]1516번. 게임 개발 (2) | 2024.10.24 |
[백준][C++]1325번. 효율적인 해킹 (1) | 2024.10.23 |
[백준][C++]18352번. 특정 거리의 도시 찾기 (1) | 2024.10.23 |
[백준][C++]9461번. 파도반 수열 (2) | 2024.10.22 |