탐색의 시작점을 반복문을 돌리지만 이전에 이미 방문했다면 탐색하지 않는것이 추가 되어야했다.
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
vector<vector<int>> edge;
vector<bool> visited(20001, false);
vector<int> color(20001, -1);
bool answer = true;
void Dfs(int vertex)
{
if (!visited[vertex])
{
visited[vertex] = true;
color[vertex] = 0;
}
for (int i = 0; i < edge[vertex].size(); ++i)
{
int index = edge[vertex][i];
if (!visited[index])
{
if (color[vertex] == 0)
{
color[index] = 1;
visited[index] = true;
Dfs(index);
}
else if(color[vertex] == 1)
{
color[index] = 0;
visited[index] = true;
Dfs(index);
}
}
else
{
if (color[vertex] == color[index])
{
answer = false;
}
}
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
for (int o = 0; o < n; ++o)
{
int v, e = 0;
cin >> v >> e;
edge.clear();
edge.resize(v + 1);
visited.clear();
visited.resize(20001, false);
color.clear();
color.resize(20001, -1);
for (int i = 0; i < e; ++i)
{
int u, v;
cin >> u >> v;
edge[u].push_back(v);
edge[v].push_back(u);
}
answer = true;
for (int i = 1; i <= v; ++i)
{
if (!visited[i])
{
visited[i] = true;
color[i] = 0; // 시작 노드의 색을 0으로 설정
Dfs(i);
if (!answer) break; // 이분 그래프가 아닌 경우 바로 종료
}
}
if (answer)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
'코딩 테스트' 카테고리의 다른 글
백준 - 12865 배낭 문제 (0) | 2024.11.13 |
---|---|
백준 1010 - 다리 놓기 (0) | 2024.11.11 |
백준 2559 (0) | 2024.11.08 |
프로그래머스 - 단속 카메라 (0) | 2024.11.06 |
백준 1806 - 투포인터 (0) | 2024.11.01 |