Untuk DAG yang diberikan (grafik asiklik terarah), masing-masing jenis topologisnya adalah permutasi dari semua simpul, di mana untuk setiap tepi (u, v) dalam DAG, u muncul sebelum v dalam permutasi.
Tugas Anda adalah untuk menghitung jumlah total jenis topologi DAG yang diberikan.
Aturan
- Anda dapat menggunakan format apa pun untuk mewakili grafik, seperti matriks adjacency, daftar adjacency atau daftar tepi, selama Anda tidak melakukan perhitungan yang berguna dalam pengkodean Anda. Anda juga dapat memiliki hal-hal seperti jumlah titik atau daftar titik dalam input, jika itu berguna.
- Anda dapat mengasumsikan grafik dalam input selalu DAG (tidak memiliki siklus).
- Program Anda harus bekerja secara teori untuk masukan apa pun. Tetapi itu bisa gagal jika melimpahi tipe integer dasar dalam bahasa Anda.
- Nama simpul dapat berupa nilai berurutan dalam jenis apa pun. Misalnya: angka mulai dari 0 atau 1. (Dan hanya jika Anda tidak menyimpan kode dalam angka ini, tentu saja.)
- Ini adalah kode-golf. Kode terpendek menang.
Contoh
Ini adalah input yang sama dalam berbagai format. Program Anda tidak harus menerima semuanya. Verteks selalu bilangan bulat mulai dari 0.
Adjacency list:
[ [1 2 3 5] [2 4] [] [2] [] [3] ]
Adjacency matrix:
[ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 0 0 0] [0 0 0 1 0 0] ]
Edge list:
6 [ [0 1] [0 2] [0 3] [0 5] [1 2] [1 4] [3 2] [5 3] ]
Ini adalah grafik yang ditunjukkan pada gambar ini:
Outputnya harus:
9
Jenis topologi adalah:
[0 1 4 5 3 2]
[0 1 5 4 3 2]
[0 1 5 3 4 2]
[0 1 5 3 2 4]
[0 5 1 4 3 2]
[0 5 1 3 4 2]
[0 5 1 3 2 4]
[0 5 3 1 4 2]
[0 5 3 1 2 4]
code-golf
combinatorics
graph-theory
permutations
jimmy23013
sumber
sumber
Jawaban:
CJam - 25
Dengan bantuan besar dari user23013 :)
Cobalah online
Penjelasan:
Algoritma umum sama dengan dalam solusi Python xnor .
Kuncinya di sini adalah
j
operator, yang melakukan rekursi memoised. Dibutuhkan parameter, nilai atau larik untuk nilai awal (seperti dalam f (0), f (1), dll) dan blok untuk menentukan rekursi. Thej
operator digunakan lagi di dalam blok untuk melakukan panggilan rekursif (dan memoized) ke blok yang sama. Ini juga dapat digunakan dengan beberapa parameter, tetapi tidak demikian halnya di sini.inovasi hebat user23013 adalah menggunakan j dengan tipe data yang berbeda, menggunakan daftar kedekatan sebagai array nilai awal.
sumber
Python, 58
Input terdiri dari kamus kedekatan
G
dan satu set simpulV
.Kode ini bersifat rekursif. Set
V
menyimpan semua node yang masih perlu dikunjungi. Untuk setiap simpul potensial berikutnya, kami memeriksa kesesuaiannya dengan melihat apakah tidak ada simpul yang tersisa menunjuk ke sana, denganV-G[v]==V
memeriksa ituV
danG[v]
terpisah. Untuk semua simpul yang cocok, kami menambahkan jumlah jenis topologi dengan itu dihapus. Sebagai kasing, set kosong memberi 1.sumber
Mathematica,
805751 byteImplementasi definisi yang sangat mudah. Saya hanya menghasilkan semua permutasi dan menghitung berapa banyak dari mereka yang valid. Untuk memeriksa apakah permutasi valid, saya mendapatkan semua pasangan simpul dalam permutasi. Nyaman,
Subsets[l,{2}]
tidak hanya memberi saya semua pasangan, itu juga mempertahankan urutan mereka ditemukanl
- hanya apa yang saya butuhkan.Di atas adalah fungsi yang mengharapkan daftar titik dan tepi, seperti
jika Anda memanggil fungsi
f
.Saya akan mencoba bermain golf ini, atau mungkin menggunakan pendekatan lain nanti.
sumber
Pyth, 27 byte
Menentukan fungsi input 2
g
,. Input pertama adalah jumlah simpul, kedua adalah daftar tepi terarah.Untuk mengetes:
Coba di sini.
sumber
^UGG
, yang menghasilkan semuaG
daftar entrirange(len(G))
.[0, 1, ...]
langsung pada input?^GlG
vs^UGG
.Haskell,
1021071008985 byteInput adalah nomor titik tertinggi (dimulai dengan 0) dan daftar tepi, di mana ujung adalah daftar dua elemen. Contoh penggunaan:
5 # [[0,1], [0,2], [0,3], [0,5], [1,2], [1,4], [3,2], [5,3]]
Cara kerjanya: hitung semua permutasi
p
dari simpul yang[u,v]
memuaskan semua sisi : posisiu
inp
lebih kecil dari posisiv
inp
. Itu implementasi langsung dari definisi.Sunting: versi pertama saya mengembalikan jenis topologi sendiri dan tidak berapa banyak. Memperbaikinya.
Sunting II: tidak berfungsi untuk grafik dengan simpul yang tidak terhubung. Memperbaikinya.
sumber