독립 간선 집합과 인증서

이분 그래프에서 최대 매칭과 최대 독립 정점 집합을 구하고, 사전순으로 가장 작은 답을 출력한다.

어려움8그래프최단 경로그리디조합론아직 제출이 없습니다시간 제한1초메모리 제한512 MB

문제

GG를 단순 무방향 그래프라고 하자. GG의 두 정점이 간선으로 이어져 있으면 두 정점은 인접하다고 하고, GG의 두 간선이 정점을 공유하면 두 간선은 인접하다고 한다. 아래 그림 1(a)의 그래프에서 정점 33과 정점 44는 간선 (3,4)(3,4)로 이어져 있으므로 인접하다. 간선 (3,4)(3,4)와 간선 (3,5)(3,5)는 정점 33을 공유하므로 인접하다.

정점 집합의 부분집합 가운데 어떤 두 정점도 인접하지 않은 것을 독립 정점 집합이라고 한다. 간선 집합의 부분집합 가운데 어떤 두 간선도 인접하지 않은 것을 독립 간선 집합이라고 한다. 크기가 가장 큰 독립 정점 집합의 크기를 정점 독립수라고 하고 α(G)\alpha(G)로 쓴다. 같은 방식으로 크기가 가장 큰 독립 간선 집합의 크기를 간선 독립수라고 하고 ν(G)\nu(G)로 쓴다.

그림 1. 그래프 G1G_1G2G_2. (a) α(G1)=4\alpha(G_1) = 4, ν(G1)=4\nu(G_1) = 4인 그래프 G1G_1. (b) α(G2)=6\alpha(G_2) = 6, ν(G2)=3\nu(G_2) = 3인 그래프 G2G_2.

독립 간선 집합 문제는 그래프에서 크기가 최대인 독립 간선 집합을 찾는 문제다. 이 문제는 오래 연구되어, 그래프 크기의 다항 시간에 끝나는 알고리즘이 여러 개 나와 있다. 그런데 프로그램이 입력 XX에 대해 답 YY를 내놓아도, 사용자는 YY가 정말 옳은 답인지 버그 때문에 망가진 답인지 알 수 없다. 인증 알고리즘은 답과 함께 인증서 ZZ를 내놓는 알고리즘이다. 사용자는 ZZ를 직접 살펴보거나 검사기 프로그램에 넣어서 답이 옳다고 확인하거나, 답을 버그가 있는 것으로 판단해 버린다.

이분 그래프에서 독립 간선 집합 문제의 인증서로 무엇이 좋은지 생각해 보자. 정점 집합을 서로소인 두 집합 UUVV로 나눌 수 있고 모든 간선이 UU의 정점 하나와 VV의 정점 하나를 잇는 그래프를 이분 그래프라고 한다. 그림 1의 두 그래프는 모두 이분 그래프이고, 주황색 정점과 파란색 정점이 각각 한쪽을 이룬다. 쾨니그 정리에 따르면 정점이 nn개인 이분 그래프 GG는 항상 ν(G)+α(G)=n\nu(G) + \alpha(G) = n을 만족한다. 그래서 최대 독립 정점 집합이 좋은 인증서가 된다. 정점이 nn개인 이분 그래프에서 크기 kk의 독립 간선 집합과 크기 nkn - k의 독립 정점 집합을 함께 찾았다면 ν(G)=k\nu(G) = k이고 α(G)=nk\alpha(G) = n - k이므로, 찾은 두 집합은 둘 다 최대다.

이분 그래프 GG가 주어진다. 최대 독립 간선 집합 YY와, 인증서로 쓸 최대 독립 정점 집합 ZZ를 찾아 출력하라. 정점에는 11번부터 nn번까지 번호가 붙어 있다. 검사기는 YY에 속한 두 간선이 서로 인접하지 않음을 확인하고, ZZ에 속한 두 정점이 서로 인접하지 않음을 확인한 뒤, Y+Z=n|Y| + |Z| = n이면 답을 받아들인다.

입력

첫째 줄에 그래프의 정점 개수 nn과 간선 개수 mm이 공백을 두고 주어진다. (1n10001 \le n \le 1000, 1m500001 \le m \le 50000)

다음 mm개의 줄에 간선이 한 개씩 주어진다. 각 줄에는 그 간선이 잇는 두 정점의 번호 uuvv가 공백을 두고 주어진다. (1u,vn1 \le u, v \le n, uvu \neq v)

주어지는 그래프는 단순 이분 그래프이며, 연결 그래프가 아닐 수도 있다. 같은 간선이 두 번 주어지지 않는다.

출력

첫째 줄에 최대 독립 간선 집합의 크기 kk를 출력한다.

다음 kk개의 줄에 그 집합에 속한 간선을 한 개씩 출력한다. 간선은 두 정점 번호를 작은 번호부터 큰 번호 순서로 출력한다. 줄은 첫 번호가 작은 것부터 출력하고, 첫 번호가 같으면 둘째 번호가 작은 것부터 출력한다. 최대 독립 간선 집합이 여러 개면, 이렇게 정렬한 간선 목록이 사전순으로 가장 앞서는 집합을 출력한다.

그 다음 줄에 인증서의 크기 kk'을 출력하고, 이어지는 줄에 인증서에 속한 정점 번호를 오름차순으로 공백을 두고 출력한다. 최대 독립 정점 집합이 여러 개면, 오름차순으로 정렬한 정점 목록이 사전순으로 가장 앞서는 집합을 출력한다.

두 규칙을 모두 지키는 출력은 하나뿐이다.