본문 바로가기

코딩 테스트

백준 1707 - 이분 그래프

탐색의 시작점을 반복문을 돌리지만 이전에 이미 방문했다면 탐색하지 않는것이 추가 되어야했다.

#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