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.
sumber
[[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)Pyth , 8 byte
Cobalah online!
Spesifikasi
[(0,1), (0,2), (1,3), (1,4), (2,3), (3,4), (3,5), (5,6)]
[(1, 4), (2, 3), (5, 6)]
sumber
Bahasa Wolfram,
2522 byteDisimpan 3 byte berkat @MartinEnder
Ini mengambil input sebagai
Graph
objek (didefinisikan sebagaiGraph[{1<->2,2<->3,1<-3>}]
dll.)sumber
@#&
.import solve_problem; run()
. Sekarang seseorang hanya perlu menulis sebuah plugin untuk Wolfram yang mengambil URL tantangan codegolf dan menghasilkan output yang diinginkan. Sebut sajaGolf
.Brachylog , 5 byte
Cobalah online!
Ini dijamin maksimal, karena Brachylog mencari dari subset terbesar.
sumber
≠∧
, sedangkan kode kedua berakhirL≠
.∧
, akan ada yang tersirat.
di akhir. Semua∧
cara di sini adalah bahwa.
tidak boleh dimasukkan pada akhir.L
adalah variabel sementara yang digunakan di mana-mana, karenanya kemampuannya untuk dihilangkan.JavaScript (ES6), 67 byte
Menggunakan pendekatan serakah untuk golfiness maksimal.
sumber
JavaScript (ES6),
6866 byteSaya pikir saya akan memberikan pendekatan rekursif, dan dengan mencuri trik persimpangan set @ ETHproduction saya berhasil memotong jawabannya!
Saya bukan orang pertama yang salah membaca pertanyaan awal, dan saya akan mengirimkan fungsi rekursif berikut yang menemukan satu set tepi pencocokan maksimal, daripada serangkaian tepi pencocokan maksimal. Perbedaan yang halus, saya tahu!
Pendekatan rekursif sederhana. Untuk setiap elemen input, hapus semua tepi yang saling bertentangan dari set dan temukan set maksimal tepi yang cocok dari subset yang tersisa, kemudian temukan hasil maksimal di atas setiap elemen input. Agak tidak efisien untuk set besar (9-byte speed-up dimungkinkan).
sumber
Jelly ,
1211 byteCobalah online!
Input sampel:
[0,1],[0,2],[1,3],[1,4],[2,3],[3,4],[3,5],[5,6]
Output sampel:
[[1, 4], [2, 3], [5, 6]]
Bagaimana itu bekerja
sumber