Bu zorluğun amacına sonlu yönlendirilmiş asiklik bir grafik (DAG) verilir, grafiğin geçişli bir azalma olup olmadığını belirler .
Bir DAG ve geçişli indirimlerin ne olduğuna dair kısa bir açıklama:
DAG, yönlendirilmiş kenarları olan bir grafiktir (yani, bu kenarda yalnızca bir yönde seyahat edebilirsiniz), böylece grafikteki herhangi bir başlangıç düğümü verildiğinde, başlangıç düğümüne geri dönmek imkansızdır (yani döngü yoktur).
Herhangi bir başlangıç düğümü göz önüne alındığında, herhangi bir gelişigüzel pozitif sayıda kenar aracılığıyla grafikteki başka bir bitiş düğümüne gitmek mümkünse, bu bitiş düğümü başlangıç düğümünden ulaşılabilir olarak tanımlanır. Genel bir DAG'da, bir başlangıç düğümünden bir hedef bitiş düğümü için alınabilen birden çok yol olabilir. Örneğin, şu elmas grafiğini alın:
Düğüme almak için D
gelen A
, ya yolu sürebilir A->B->D
veya A->C->D
. Böylece, D
ulaşılabilir A
. Ancak, düğümden B
başlayarak düğüme ulaşmak için gidilebilecek bir yol yoktur C
. Bu nedenle, düğüme düğümden B
erişilemez C
.
Grafiğin erişilebilirliğini , grafikteki her başlangıç düğümü için erişilebilir düğümlerin listesi olarak tanımlayın . Aynı örnek elmas grafik için erişilebilirlik:
A: [B, C, D]
B: [D]
C: [D]
D: []
Yukarıdaki grafikle aynı erişilebilirliğe sahip başka bir grafik aşağıda gösterilmiştir:
Ancak, bu ikinci grafik orijinal grafikten daha fazla kenara sahiptir. Bir grafiğin geçişli indirgemesi, en az sayıda kenar ve orijinal grafiğin aynı erişilebilirliğine sahip bir grafiktir. İlk grafik, ikincisinin geçişli indirgenmesidir.
Sonlu bir DAG için geçişli azalmanın var olması garanti edilir ve benzersizdir.
Giriş
Giriş, "liste listesi" dir; burada harici liste köşe sayısı uzunluğuna sahiptir ve her dahili liste ilişkili düğümü terk eden kenar sayısının uzunluğudur ve hedef düğümlerin indekslerini içerir. Örneğin, yukarıdaki ilk grafiği tanımlamanın bir yolu (sıfır tabanlı indeksleme varsayarak):
[[1, 2], [3], [3], []]
İlk düğümü rasgele herhangi bir tamsayı değerinde dizine başlatabilirsiniz (örn. 0 veya 1 tabanlı dizine ekleme).
Giriş, istenen herhangi bir giriş kaynağından gelebilir (stdio, fonksiyon parametresi, vb.). Ek bilgi verilmediği sürece kesin giriş biçimini seçebilirsiniz. Örneğin, stdio'dan girdi almak istiyorsanız, her satırın ilişkili düğüm için bir kenar listesi olması gerekir. Ör .:
1 2
3
3
'' (blank line)
Her bitişiklik listesindeki indeksler mutlaka sıralanmaz ve iki düğümü birbirine bağlayan birden fazla kenar olabilir (örn [[1,1],[]]
. :) . Giriş grafiğinin zayıf bir şekilde bağlı olduğunu ve döngü içermediğini (yani bir DAG olduğunu) varsayabilirsiniz .
Çıktı
Eğer verilen DAG bir geçişli redüksiyon ve aksi takdirde bir falsy değeri ise çıktı doğrudur. Bu istenen herhangi bir lavaboya olabilir (stdio, dönüş değeri, çıkış parametresi, vb.)
Örnekler
Tüm örnekler 0 tabanlı indeksleme kullanır.
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
puanlama
Bu kod golf; bayttaki en küçük kod kazanır. Kodunuz makul bir sürede tamamlanmalıdır (sahip olduğunuz donanımda en fazla 10 dakika). Standart boşluklar geçerlidir. İstediğiniz yerleşik bileşenleri kullanabilirsiniz.