연결된 무 방향 그래프를 고려하십시오. 에지 정합 집합 이 그래프에서 에지가되도록 설정된 주에있는 두 개의 에지가 공통 정점의 집합으로 정의된다. 예를 들어 왼쪽 그림은 녹색으로 일치하는 집합을 나타내고 오른쪽 그림은 비 일치 집합을 빨간색으로 나타냅니다.
일치 집합은이라고하며 maximally matching
, maximal matching
일치하는 집합에 그래프의 다른 가장자리를 추가 할 수없는 경우입니다. 따라서 위의 두 예제는 모두 최대 일치 세트가 아니지만 아래의 파란색 세트는 모두 최대 일치입니다. 최대 일치는 반드시 고유하지는 않습니다. 또한, 그래프에 대해 가능한 최대 매칭의 크기가 다른 매칭과 동일 할 필요는 없습니다.
이 과제의 목표는 프로그램 / 함수를 작성하여 그래프의 최대 매칭을 찾는 것입니다.
입력
입력 그래프의 모든 정점에 선택한 시작 정수 값에서 시작하는 연속적인 정수 번호가 있다고 가정합니다. 에지는 에지가 연결하는 정점을 나타내는 정렬되지 않은 정수 쌍으로 설명됩니다. 예를 들어, 위에 표시된 그래프는 다음과 같이 정렬되지 않은 다음 모서리 세트로 설명 될 수 있습니다 (정점의 번호가 0에서 시작한다고 가정).
[(0,1), (0,2), (1,3), (1,4), (2,3), (3,4), (3,5), (5,6)]
그래프를 설명하는 다른 방법은 인접 목록을 사용하는 것입니다. 위의 그래프에 대한 예제 인접 목록은 다음과 같습니다.
[0:(1,2), 1:(0,3,4), 2:(0,3), 3:(1,2,4,5), 4:(1,3), 5:(3,6), 6:(5)]
프로그램 / 기능은 소스 (stdio, function parameter 등)에서 그래프를 입력으로 가져와야합니다. 사소한 추가 정보가 프로그램에 전달되지 않는 한 원하는 표기법을 사용할 수 있습니다. 예를 들어, 입력 에지 수를 나타내는 추가 매개 변수를 갖는 것은 완벽하게 허용됩니다. 마찬가지로 정렬되지 않은 여러 가장자리 세트, 인접 목록 또는 인접 행렬을 전달하는 것이 좋습니다.
당신은 가정 할 수 있습니다 :
- 그래프가 연결됩니다 (예 : 시작 정점이 주어지면 정점에 도달 할 수 있음).
- 가장자리가 하나 이상 있습니다.
- 가장자리는 절대 꼭짓점을 직접 연결하지 않습니다 (예 : 가장자리
(1,1)
는 입력으로 제공되지 않습니다). 사이클은 여전히 가능합니다 (예 : 위의 그래프). - 입력 정점은 모든 인덱스에서 시작해야 할 수 있습니다 (예 : 첫 번째 정점은 0, 1, -1 등일 수 있음).
- 정점 번호는 선택한 시작 색인 (예 :
1,2,3,4,...
, 또는0,1,2,3,...
) 에서 순차적으로 증가하고 있습니다 .
산출
프로그램 / 기능은 최대 일치 세트를 나타내는 모서리 목록을 출력해야합니다. 모서리는 해당 모서리가 연결되는 두 정점으로 정의됩니다. 전의. 왼쪽 파란색 세트에 대한 출력 (입력 정점 순서 예제 사용) :
[(1,4), (2,3), (5,6)]
꼭짓점의 순서는 중요하지 않습니다. 따라서 다음 출력은 동일한 일치 세트를 설명합니다.
[(4,1), (2,3), (6,5)]
출력은 stdout, 파일, 함수 반환 값 등이 될 수 있습니다.
예
다음은 입력 목록의 예입니다 (인접 목록 형식 사용). 이 예제는에서 정점 계산을 시작합니다 0
.
예제 출력은 제공되지 않으며 대신 Python 3 유효성 검사 코드를 포함 시켰습니다.
[0:(1), 1:(0)]
[0:(1,2), 1:(0,3,4), 2:(0,3), 3:(1,2,4,5), 4:(1,3), 5:(3,6), 6:(5)]
[0:(1,2), 1:(0,2,3,4,5), 2:(0,1), 3:(1), 4:(1), 5:(1)]
[0:(1,2), 1:(0,2,3), 2:(0,1,4), 3:(1,4,5), 4:(2,3), 5:(3)]
유효성 검사 Python 3 코드
다음은 그래프와 가장자리 집합을 가져 와서 해당 집합이 최대 일치하는지 여부를 인쇄하는 Python 3 유효성 검사 코드입니다. 이 코드는 모든 버텍스 시작 인덱스와 함께 작동합니다.
def is_maximal_matching(graph, edges):
'''
Determines if the given set of edges is a maximal matching of graph
@param graph a graph specified in adjacency list format
@param edges a list of edges specified as vertex pairs
@return True if edges describes a maximal matching, False otherwise.
Prints out some diagnostic text for why edges is not a maximal matching
'''
graph_vtxs = {k for k,v in graph.items()}
vtxs = {k for k,v in graph.items()}
# check that all vertices are valid and not used multiple times
for e in edges:
if(e[0] in graph_vtxs):
if(e[0] in vtxs):
vtxs.remove(e[0])
else:
print('edge (%d,%d): vertex %d is used by another edge'%(e[0],e[1],e[0]))
return False
else:
print('edge (%d,%d): vertex %d is not in the graph'%(e[0],e[1],e[0]))
return False
if(e[1] in graph_vtxs):
if(e[1] in vtxs):
vtxs.remove(e[1])
else:
print('edge (%d,%d): vertex %d is used by another edge'%(e[0],e[1],e[1]))
return False
else:
print('edge (%d,%d): vertex %d is not in the graph'%(e[0],e[1],e[0]))
return False
if(e[1] not in graph[e[0]]):
print('edge (%d,%d): edge not in graph'%(e[0],e[1]))
return False
# check that any edges can't be added
for v in vtxs:
ovtxs = graph[v]
for ov in ovtxs:
if(ov in vtxs):
print('could add edge (%d,%d) to maximal set'%(v,ov))
return False
return True
사용법 예 :
graph = {0:[1,2], 1:[0,3,4], 2:[0,3], 3:[1,2,4,5], 4:[1,3], 5:[3,6], 6:[5]}
candidate = [(0,1),(2,3)]
is_maximal_matching(graph, candidate) // False
candidate = [(0,1),(2,3),(5,6),(0,1)]
is_maximal_matching(graph, candidate) // False
candidate = [(0,1),(2,3),(5,6)]
is_maximal_matching(graph, candidate) // True
채점
이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다. 표준 허점이 적용됩니다. 원하는 내장 기능을 사용할 수 있습니다.
[[0 1] [3 4]]
최대 세트 대신에 세 번째 예제에서 실패한다고 확신합니다[[0 2] [1 4] [3 5]]
. ((1, 1)
실수로