Güçlü Bağlantılı Bileşenler


16

Grafikte birbirinden yol varsa, yönlendirilmiş bir grafikteki iki farklı köşe güçlü bir şekilde bağlanır . Bir güçlü bağlantılı bileşen grafik alt grubunda belirgin tepe noktaları her bir çifti arasında güçlü bir bağlantı vardır ve alt-bir daha köşe ekleyerek, bu özellik kıracak şekilde grafik bir alt kümesidir.

Zorluklarınız bir grafiği güçlü bir şekilde bağlı bileşenlerine ayırmaktır. Özellikle, grafikteki tüm SCC'leri çıkarmalısınız.

I / O:

Giriş olarak, yönlendirilmiş kenarların bir listesini, bir bitişiklik listesini, bir bitişiklik matrisini veya başka bir makul giriş biçimini kullanabilirsiniz. Emin olmadığınızı sorun. Grafiğin tamamen bağlantısı kesilmiş köşeleri olmadığını ve kendinden kenarların olmadığını varsayabilirsiniz, ancak başka varsayımlar yapamayabilirsiniz. İsteğe bağlı olarak, köşe sayısını girdi olarak ve köşe sayısını da alabilirsiniz.

Çıktı olarak, her alt listenin güçlü bir şekilde bağlı bir bileşen olduğu köşe listesi listesi gibi köşelerin bölümlenmesini veya her etiketin farklı bir bileşene karşılık geldiği köşelerin etiketlenmesini vermelisiniz.

Bir etiketleme kullanıyorsanız, etiketler ya köşeler ya da ardışık bir tamsayılar dizisi olmalıdır. Bu, hesaplamanın etiketlere yerleştirilmesini önlemek içindir.

Örnekler:

Bu örnekler, her bir kenarın 1. girişten ikinci girişe ve çıkış bölümlerine yönlendirildiği kenar listelerini alır. Bu formatı veya başka bir formatı kullanmakta serbestsiniz.

Giriş ilk satırda, çıkış ikinci satırda.

[[1, 2], [2, 3], [3, 1], [1, 4]]
[[1, 2, 3], [4]]

[[1, 2], [2, 3], [3, 4]]
[[1], [2], [3], [4]]

[[1, 2], [2, 1], [1, 3], [2, 4], [4, 2], [4, 3]]
[[1, 2, 4], [3]]

[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]
[[1, 2, 5], [3, 4, 8], [6, 7]]

Puanlama ve kısıtlamalar:

Standart boşluklar her zamanki gibi yasaklanmıştır. Ayrıca, güçlü bir şekilde bağlı bileşenlerle özel olarak ilgilenen yerleşik yapılar da yasaklanmıştır.

Çözümler, verilen örnekler üzerinde bir saatten fazla olmamalıdır. (Bu, yavaş üstel çözümleri önlemeyi amaçlamaktadır ve başka bir şey değildir.)

Bu kod golf. En az bayt kazanır.


Bağlı bir bileşene atadığımız etiketler ne kadar esnek? Örneğin, bu bileşendeki tepe noktası dizinlerinin listesi geçerli bir etiket olabilir mi?
xnor

@xnor Tamamen esnek. Eşitlik testi / özdeş dizeler ile eşleşmelidir.
isaacg

Grafik giriş biçimimiz ayrıca köşe sayısını ve / veya tepe etiketi listesini de içerebilir mi?
xnor

@xnor İkisine de evet. Bunu düzenleyeceğim.
isaacg

Son test durumunda, bunun 8bir bileşende olmadığını alıyorum [3,4]çünkü sadece her birini yapamıyor 6ve 7(ikisi de ona ulaşamıyor).
xnor

Yanıtlar:


7

Python 2, numpy kullanarak, 71 62 bayt

import numpy
def g(M,n):R=(M+M**0)**n>0;print(R&R.T).argmax(0)

Girdiyi numpybitişikliği ve düğüm sayısını temsil eden bir matris olarak alır . Çıktıyı, numpyher tepe noktasını bileşenindeki en düşük tepe noktası numarasıyla etiketleyen bir satır matrisi olarak üretir .

Bir bitişiklik matrisi için M, matris gücü , her başlangıç ​​tepe noktasından her bitiş noktasına kadar-adım yolu M**nsayısını sayar n. Özdeşlik ekleme Mile M+M**0değiştirmektedir bitişiklik matrisi, her kenarına bir kendi kendine döngü ekleyin. Yani, (M+M**0)**nen fazla uzunluk yolunu sayar n(fazlalık ile).

Herhangi bir yolun uzunluğu en fazla olduğundan n, (i,j)tepe noktasına julaşılabilen düğümlerin sayısı, ipozitif bir girişe karşılık gelir (M+M**0)**n. Daha sonra ulaşılabilirlik matrisi çalışır R=(M+M**0)**n>0, burada >0girişler çalışır.

Giriş yönünün , devrik olduğu yerde olduğu andgibi R&R.T, R.Tdaha sonra karşılıklı olarak ulaşılabilir köşe çiftlerini gösteren bir matris verir. Bu isatır, aynı güçlü şekilde bağlı bileşendeki köşeler için bir gösterge vektörüdür. argmaxHer satırdan alınması, Truebileşenindeki en küçük tepe noktasının endeksi olan içindeki ilkin dizinini verir .


4

JavaScript (ES6), 125 bayt

a=>a.map(([m,n])=>(e[m]|=1<<n|e[n],e.map((o,i)=>o&1<<m?e[i]|=e[m]:0)),e=[])&&e.map((m,i)=>e.findIndex((n,j)=>n&1<<i&&m&1<<j))

Bir argüman olarak yönlendirilmiş çiftlerin bir listesini alır, sonuç ise her bir köşe için güçlü bir şekilde bağlı ilk tepe noktasını veren bir dizi iken, geçerli bir etiketleme olarak kabul edildiğine inanıyorum. Örneğin, girdi ile [[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]geri döner [, 1, 1, 3, 3, 1, 6, 6, 3](köşe 0 yoktur; köşe 1, 2 ve 5 etiket 1'e sahiptir; 3, 4 ve 8 etiket 3'e sahipken, 6 ve 7 etiket 6'ya sahiptir).


4

MATL , 26 22 bayt

tnX^Xy+HMY^gt!*Xu!"@f!

Bu, @ xnor'un cevabı ile aynı yaklaşımı kullanır .

Dilin geçerli sürümünde (15.0.0) çalışır .

Girdi, satırların noktalı virgülle ayrıldığı grafiğin bitişik matrisidir. İlk ve son test senaryoları

[0 1 0 1; 0 0 1 0; 1 0 0 0; 0 0 0 0]

[0 1 0 0 0 0 0 0; 0 0 1 0 1 1 0 0; 0 0 0 1 0 0 1 0; 0 0 1 0 0 0 0 1; 1 0 0 0 0 1 0 0; 0 0 0 0 0 0 1 0; 0 0 0 0 0 1 0 0; 0 0 0 1 0 0 1 0]

Çevrimiçi deneyin!

t     % implicitly input adjacency matrix. Duplicate
n     % number of elements
X^    % square root
Xy    % identity matrix of that size
+     % add to adjacency matrix
HM    % push size again
Y^    % matrix power
g     % convert to logical values (0 and 1)
t!*   % multiply element-wise by transpose matrix
Xu    % unique rows. Each row is a connected component
!     % transpose
"     % for each column
  @   %   push that column
  f!  %   indices of nonzero elements, as a row
      % end for each. Implicitly display stack contents

3

Pyth, 13 bayt

.gu+Gs@LQG.{k

Gösteri , Test takımı

Girdi, köşeleri kenarları olduğu köşeler listesine (yönlendirilmiş komşularına) eşleyen sözlük olarak gösterilen bir bitişiklik listesidir. Çıktı bir bölümdür.

Programın özü, her bir tepe noktasından ulaşılabilen köşe kümesini bulmamız ve ardından köşe noktalarını bu kümelere göre gruplandırmamızdır. Aynı SCC'deki her iki köşe de onlardan erişilebilen aynı köşe setine sahiptir, çünkü her birine diğerinden ulaşılabilir ve erişilebilirlik geçişlidir. Farklı bileşenlerdeki herhangi bir köşenin farklı ulaşılabilir kümeleri vardır, çünkü neither kümesi diğerini içerir.

Kod açıklaması:

.gu+Gs@LQG.{k
                  Implicit: Q is the input adjacency list.
.g           Q    Group the vertices of Q by (Q is implicit at EOF)
  u       .{k     The fixed point of the following function, 
                  starting at the set containing just that vertex
   +G             Add to the set
     s            The concatenation of
      @LQG        Map each prior vertex to its directed neighbors
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.