1 분 소요

Question

1707Q


Solution

  • 이분 그래프는 정점에 대해 두 가지의 색으로 나누었을 때 현재 노드와 인접한 노드가 서로 다른색이면 이분 그래프가 된다.
  • 방문처리와 색깔처리를 한번에 할 nodeColor 배열을 선언한다. (0 ‘방문x’, 1, 2)
  • 방문한 노드가 0일경우 1로 만들고, 전 노드가 1이면 2, 2면 1로 다르게 색칠한다.
  • 이분 그래프 검사를 하여 도중에 인접노드와 같은 색을 띄면 중단시키고 바로 ‘NO’를 출력한다.
  • 그래프가 모두 이어져있지 않을 수 있기때문에 모든 정점에 대해 dfs()를 실행한다.

Cord

#include <iostream>
#include <vector>
#include <string.h>

#define MAX 20001

using namespace std;

int v, e;

vector<int> graph[MAX];
int nodeColor[MAX];

// color : 0 = 방문 하지 않음
void dfs(int _node)
{	
	if (!nodeColor[_node]) { nodeColor[_node] = 1; }

	for (int i = 0; i < graph[_node].size(); i++)
	{
		int next = graph[_node][i];
		if (!nodeColor[next])
		{
			if (nodeColor[_node] == 1)
			{
				nodeColor[next] = 2;
			}
			else if (nodeColor[_node] == 2)
			{
				nodeColor[next] = 1;
			}
			dfs(next);
		}
	}
}

// 인접한 노드의 색과 같으면 "No"
string answer()
{
	for (int i = 1; i <= v; i++)
	{
		for (int j = 0; j < graph[i].size(); j++)
		{
			int next = graph[i][j];
			if (nodeColor[i] == nodeColor[next])
			{
				return "NO";
			}
		}
	}
	return "YES";
}

int main()
{
	// 케이스의 수
	int k;
	cin >> k;

	for (int idx = 0; idx < k; idx++)
	{	
		// 정점의 수, 간선의 수
		cin >> v >> e;

		// 간선 연결
		for (int i = 0; i < e; i++)
		{
			int u, v;
			cin >> u >> v;

			graph[u].push_back(v);
			graph[v].push_back(u);
		}

		// dfs 실행
		for (int i = 1; i <= v; i++)
		{
			if (!nodeColor[i])
			{
				dfs(i);
			}
		}

		// 출력
		cout << answer() << '\n';

		// 초기화
		memset(graph, 0, sizeof(graph));
		memset(nodeColor, 0, sizeof(nodeColor));
	}
	return 0;
}


Result

1707

모든 정점에 대해 dfs()를 실행하지않아 실패.