DAG geçişli bir azalma mıdır?


11

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:

resim açıklamasını buraya girin

Düğüme almak için Dgelen A, ya yolu sürebilir A->B->Dveya A->C->D. Böylece, Dulaşılabilir A. Ancak, düğümden Bbaşlayarak düğüme ulaşmak için gidilebilecek bir yol yoktur C. Bu nedenle, düğüme düğümden Beriş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:

resim açıklamasını buraya girin

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.


Girdinin bağlantısı hakkında herhangi bir varsayım yapabilir miyiz? (Tüm test durumlarınızı kontrol etmedim, ancak grafiğin bağlantısının kesilmiş birden çok bölümünü kapsıyorlar mı?)
Martin Ender

doğru dil olduğuna inandığım şeyle güncellendi.
helloworld922

Sanırım bu iyi. Grafiğin zayıf bağlandığını da söyleyebilirsiniz .
Martin Ender

Yanıtlar:


5

Ruby, 101 97 bayt

Her düğümden erişimi hesaplayan ve diğer düğümlerden herhangi biri aracılığıyla bir alt düğüme erişilip erişilemeyeceğini dikkate alan basit yaklaşım. Görünüşe göre döngüsel grafiklerde başarısız oluyor, ancak bir DAG'ın tanımı, yine de döngüsel olmaması gerektiğini ima ediyor.

Çevrimiçi deneyin!

->g{r=->i{i|i.map{|j|r[g[j]||[]]}.inject([],:|)}
g.all?{|e|e==e&e&&e.none?{|i|r[e-[i]].index i}}}

4

Mathematica, 95 82 bayt

@MartinEnder nedeniyle 13 bayt kaydedildi .

#~IsomorphicGraphQ~TransitiveReductionGraph@#&@Graph[x=0;##&@@Thread[++x->#]&/@#]&

Anonim işlev. Yuvalanmış bir listeyi (1 tabanlı) girdi olarak alır ve döndürür Trueveya Falseçıktı olarak alır. Buradaki ana çözüm #~IsomorphicGraphQ~TransitiveReductionGraph@#&, belirli bir grafiğin geçişsel indirgenmesine izomorfik olup olmadığını test eden 46 bayttır . Geri kalanı girişi bir Graphnesneye dönüştürür .


3

CJam (41 bayt)

q~:A_,{{Af=e__&}%_}*]:.|A.&A:$:e`e_2%1-*!

Çevrimiçi demo , test donanımı

teşrih

q~:A      e# Parse input and store in A
_,{       e# Loop V times
  {       e#   Extend adjacency list representation of G^i to G^(i+1)
    Af=   e#   by extending each path by one edge
    e__&  e#   and flattening. NB :| would be shorter but breaks for empty lists
  }%
  _       e#   Duplicate, so that we build up G^2, G^3, ..., G^n
}*]       e# Gather in a single array
:.|       e# Fold pointwise union, giving the reachability from each vertex by
          e# paths of length > 1
A.&       e# Pointwise intersect with the paths of length 1
          e# We hope to get an array of empty arrays

          e# Handle the awkward special case of duplicate edges:
A:$       e# Sort each adjacency list
:e`       e# Run-length encode each adjacency list
e_2%      e# Extract only the run lengths
1-        e# Discard the 1s - so we now have an empty array unless there's a dupe

*         e# Join. We hope to be joining an array of empty arrays by an empty array
          e# giving an empty array
!         e# Check that we get a falsy value (i.e. the empty array)

3

Jöle, 20 bayt

ị³$ÐĿ€ị@Fœ&¥";œ-Q$€E

1 tabanlı indeksleme kullanır. Çevrimiçi deneyin!

Gevşek Genel Bakış

     €                for each vertex,
ị³$ÐĿ                   compute its reach.
        Fœ&¥"         intersect each vertex's lists of children and
      ị@                children's reaches.
             ;        then concatenate the list of intersections with
              œ-Q$€     all duplicate edges in the original graph.
                   E  are all elements equal? checks that all are empty lists,
                        meaning empty intersections and no duplicates.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.