미스터리 그래프 색칠
면접 대비시간 제한1초메모리 제한128 MB
0번부터 V-1번 정점을 이미 칠해진 이웃이 쓰지 않은 가장 작은 색으로 칠하고 색 수와 색칠 결과, 반복 횟수를 출력합니다.
문제
정점 개와 간선 개로 이루어진 무방향 그래프 가 있다. 각 정점에 이상 미만의 정수를 하나씩 붙이되, 한 간선의 두 끝점에는 서로 다른 수가 붙어야 한다. 이 수를 색이라고 부른다.
조건을 만족하는 색칠은 여러 가지이므로, 답은 아래 절차가 만드는 색칠 하나로 정한다. 절차는 정점을 번부터 번까지 차례로 보면서, 이미 색이 정해진 이웃이 쓰지 않은 색 중 가장 작은 색을 그 정점에 붙인다. 절차는 실행하는 동안 counter 변수를 아래와 같이 늘린다.
counter = 0
color[0..V-1] = -1
for i = 0 to V-1:
used = empty set
for each j in adj[i]:
counter = counter + 1
if color[j] != -1:
add color[j] to used
for c = 0 to V-1:
counter = counter + 1
if c is not in used:
color[i] = c
break
adj[i]는 정점 와 간선으로 이어진 정점의 목록이다. 이웃을 정확히 한 번씩 세므로 목록의 순서는 색칠 결과도, counter의 최종 값도 바꾸지 않는다. 는 절차가 쓴 색의 개수, 곧 color 값의 최댓값에 을 더한 값이다.
입력
첫째 줄에 와 가 공백으로 구분되어 주어진다. 다음 개 줄에는 간선의 두 끝점을 나타내는 와 가 주어진다.
- 모든 간선 에 대해 이고, , 이다.
- 같은 간선은 두 번 이상 주어지지 않는다. 와 는 같은 간선이다.
출력
첫째 줄에 를 출력한다. 둘째 줄에는 번 정점부터 번 정점에 붙인 색을 공백 하나로 구분해 출력한다. 셋째 줄에는 The value of counter is: 다음에 공백 하나를 두고 counter의 최종 값을 출력한다.