Pertimbangkan grafik yang tidak diarahkan yang terhubung. Sebuah cocok set tepi pada grafik ini didefinisikan sebagai satu set tepi sehingga tidak ada dua sisi dalam pangsa set vertex umum. Misalnya, gambar kiri menunjukkan set yang cocok berwarna hijau, sedangkan angka kanan menunjukkan set yang tidak cocok berwarna merah.
Himpunan yang cocok dikatakan sebagai maximally matching
, atau maximal matching
jika tidak mungkin untuk menambahkan sisi lain dari grafik ke himpunan yang cocok. Jadi kedua contoh di atas bukan set pencocokan maksimal, tetapi kedua set di bawah ini dalam warna biru adalah pencocokan maksimal. Perhatikan bahwa pencocokan maksimal belum tentu unik. Selain itu, tidak ada persyaratan bahwa ukuran setiap pencocokan maksimal yang mungkin untuk grafik sama dengan pencocokan lain.
Tujuan dari tantangan ini adalah untuk menulis suatu program / fungsi untuk menemukan pencocokan maksimal grafik.
Memasukkan
Asumsikan semua simpul dari grafik input memiliki penomoran bilangan bulat berurutan yang dimulai dari nilai integer awal pilihan Anda. Suatu tepi digambarkan oleh sepasang bilangan bulat yang tidak berurutan yang menunjukkan simpul yang disambungkan ujung tersebut. Misalnya, grafik yang ditunjukkan di atas dapat dijelaskan dengan kumpulan tepi yang tidak berurutan berikut (dengan asumsi penomoran simpul dimulai pada 0):
[(0,1), (0,2), (1,3), (1,4), (2,3), (3,4), (3,5), (5,6)]
Cara alternatif untuk menggambarkan grafik adalah melalui daftar adjacency. Berikut adalah contoh daftar kedekatan untuk grafik di atas:
[0:(1,2), 1:(0,3,4), 2:(0,3), 3:(1,2,4,5), 4:(1,3), 5:(3,6), 6:(5)]
Program / fungsi Anda harus mengambil input dari sumber apa pun (stdio, parameter fungsi, dll.). Anda dapat menggunakan notasi apa pun yang diinginkan selama tidak ada informasi non-sepele tambahan dikomunikasikan ke program Anda. Sebagai contoh, memiliki parameter tambahan yang menunjukkan jumlah tepi input sangat dapat diterima. Demikian pula, melewatkan multiset tepi yang tidak teratur, daftar adjacency, atau matriks adjacency baik-baik saja.
Anda dapat mengasumsikan:
- Grafik terhubung (misalnya, dimungkinkan untuk mencapai titik mana pun mengingat titik awal mana pun).
- Setidaknya ada satu sisi.
- Edge tidak pernah menghubungkan vertex secara langsung ke dirinya sendiri (mis. Edge
(1,1)
tidak akan diberikan sebagai input). Perhatikan bahwa siklus masih dimungkinkan (mis .: grafik di atas). - Anda mungkin mensyaratkan bahwa simpul input mulai pada indeks apa pun (misalnya simpul pertama bisa 0, 1, -1, dll.).
- Penomoran vertikal meningkat secara berurutan dari indeks awal yang Anda pilih (mis .:
1,2,3,4,...
, atau0,1,2,3,...
).
Keluaran
Program / fungsi Anda harus menampilkan daftar tepi yang menunjukkan set pencocokan maksimal. Tepi ditentukan oleh dua simpul yang disambungkan oleh tepian itu. Ex. output untuk set biru kiri (menggunakan contoh input vertex pemesanan):
[(1,4), (2,3), (5,6)]
Perhatikan bahwa urutan simpul tidak penting; Jadi output berikut ini menjelaskan set yang sama:
[(4,1), (2,3), (6,5)]
Output mungkin ke stdout, file, nilai pengembalian fungsi, dll.
Contohnya
Berikut adalah beberapa contoh input (menggunakan format daftar adjacency). Contoh-contoh ini mulai menghitung titik di 0
.
Perhatikan bahwa tidak ada contoh output yang diberikan, sebagai gantinya saya telah memasukkan kode validasi 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)]
Validasi kode Python 3
Berikut adalah kode validasi Python 3 yang mengambil grafik dan set tepi dan mencetak apakah set itu secara maksimal cocok atau tidak. Kode ini berfungsi dengan indeks titik awal mana pun.
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
Contoh penggunaan:
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
Mencetak gol
Ini adalah kode golf; kode menang paling pendek. Celah standar berlaku. Anda dapat menggunakan built-in yang diinginkan.
[[0 1] [3 4]]
bukannya set maksimal[[0 2] [1 4] [3 5]]
. (Saya mengabaikan(1, 1)
tepi yang tampaknya ada di sana karena kesalahan)