ส่วนประกอบที่เชื่อมต่ออย่างยิ่ง


16

จุดยอดที่แตกต่างกันสองจุดในกราฟกำกับนั้นเชื่อมต่อกันอย่างแน่นหนาหากมีเส้นทางในกราฟจากจุดหนึ่งไปยังอีกจุดหนึ่ง องค์ประกอบเชื่อมต่ออย่างยิ่งของกราฟเป็นส่วนหนึ่งของกราฟดังกล่าวว่าคู่ของจุดที่แตกต่างกันในกลุ่มย่อยในแต่ละมีการเชื่อมต่ออย่างมากและเพิ่มจุดใด ๆ ที่มากขึ้นในการย่อยจะทำลายคุณสมบัตินี้

ความท้าทายของคุณคือการแยกกราฟออกเป็นส่วนประกอบที่เชื่อมต่ออย่างแน่นหนา คุณต้องส่งออก SCC ทั้งหมดในกราฟ

I / O:

ในฐานะที่เป็นอินพุตคุณอาจใช้รายการของขอบชีทรายการ adjacency เมทริกซ์ adjacency หรือรูปแบบอินพุตที่สมเหตุสมผลอื่น ๆ ถามว่าคุณไม่แน่ใจ คุณอาจสมมติว่ากราฟไม่มีการตัดการเชื่อมต่อทั้งหมดและไม่มีขอบตัวเอง แต่คุณไม่สามารถตั้งสมมติฐานเพิ่มเติมได้ คุณยังสามารถเลือกรายการจุดยอดเป็นอินพุตเช่นเดียวกับจำนวนจุดยอด

ในฐานะที่เป็นเอาท์พุทคุณจะต้องให้การแบ่งจุดยอดเช่นรายการของจุดยอดที่แต่ละรายการย่อยเป็นองค์ประกอบที่เชื่อมต่ออย่างยิ่งหรือการติดฉลากของจุดยอดที่แต่ละป้ายสอดคล้องกับองค์ประกอบที่แตกต่างกัน

หากคุณใช้การติดฉลากฉลากจะต้องเป็นจุดยอดหรือลำดับของจำนวนเต็มติดต่อกัน นี่คือการป้องกันไม่ให้หลุดการคำนวณลงในฉลาก

ตัวอย่าง:

ตัวอย่างเหล่านี้ใช้รายการขอบที่แต่ละขอบถูกชี้นำจากรายการที่ 1 ไปยังรายการที่สองและพาร์ติชันเอาท์พุท คุณมีอิสระที่จะใช้รูปแบบนี้หรือรูปแบบอื่น

อินพุตอยู่บนบรรทัดแรกเอาต์พุตอยู่บนบรรทัดที่สอง

[[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]]

เกณฑ์การให้คะแนนและข้อ จำกัด :

ช่องโหว่มาตรฐานถูกแบนเช่นเคย นอกจากนี้บิวด์อินที่จัดการเฉพาะกับส่วนประกอบที่เชื่อมต่ออย่างยิ่งถูกห้าม

โซลูชันควรทำงานในไม่เกินหนึ่งชั่วโมงในตัวอย่างที่ให้ไว้ (สิ่งนี้มีไว้เพื่อป้องกันการแก้ปัญหาเลขชี้กำลังช้าและไม่มีอะไรอื่น)

นี่คือรหัสกอล์ฟ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ


ฉลากที่เรากำหนดให้กับส่วนประกอบที่เชื่อมต่อมีความยืดหยุ่นเพียงใด ตัวอย่างเช่นรายการดัชนีจุดสุดยอดในองค์ประกอบนั้นจะเป็นป้ายกำกับที่ถูกต้องหรือไม่
xnor

@xnor ยืดหยุ่นอย่างเต็มที่ ควรจับคู่ผ่านการทดสอบความเท่าเทียมกัน / สตริงที่เหมือนกัน
isaacg

รูปแบบอินพุตกราฟของเราอาจมีจำนวนจุดยอดและ / หรือรายการป้ายชื่อจุดยอดได้หรือไม่
xnor

@xnor ใช่ทั้งคู่ ฉันจะแก้ไขสิ่งต่อไปนี้
isaacg

ในกรณีทดสอบครั้งล่าสุดฉันได้รับสิ่ง8นั้นไม่ได้อยู่ในส่วนประกอบ[3,4]เนื่องจากไม่สามารถทำได้เฉพาะ6และ7(ซึ่งไม่สามารถเข้าถึงได้)
xnor

คำตอบ:


7

Python 2 ใช้จำนวน71 62 ไบต์

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

รับอินพุตเป็นnumpyเมทริกซ์ที่แสดงถึงคำคุณศัพท์และจำนวนโหนด สร้างเอาต์พุตเป็นnumpyเมทริกซ์แถวที่เลเบลแต่ละจุดยอดด้วยจำนวนจุดยอดที่ต่ำที่สุดในส่วนประกอบ

สำหรับเมทริกซ์คำคุณศัพท์ Mคำคุณศัพท์พลังเมทริกซ์M**nจะนับจำนวนของnเส้นทาง -step จากจุดเริ่มต้นแต่ละจุดเริ่มต้นไปยังจุดสุดปลายแต่ละจุด การเพิ่มตัวตนให้Mผ่านการM+M**0แก้ไขเมทริกซ์ adjacency เพื่อเพิ่มการวนซ้ำตัวเองในทุก ๆ ขอบ ดังนั้น(M+M**0)**nนับเส้นทางที่มีความยาวมากที่สุดn(พร้อมความซ้ำซ้อน)

เนื่องจากเส้นทางใด ๆ มีความยาวสูงสุดnจำนวนโหนดใด ๆ(i,j)ที่จุดสุดยอดjสามารถเข้าถึงได้จากสอดคล้องกับรายการในเชิงบวกของi (M+M**0)**nเมทริกซ์เชื่อมแล้วR=(M+M**0)**n>0ที่>0งาน entrywise

การคำนวณค่าตามเข็มนาฬิกาandว่าR&R.Tอยู่ที่ไหนR.Tการแปลงสภาพจะให้เมทริกซ์แสดงคู่ของจุดยอดที่สามารถเข้าถึงได้ซึ่งกันและกัน มันเป็นiแถวที่สามเป็นเวกเตอร์ตัวบ่งชี้สำหรับจุดยอดในองค์ประกอบที่เชื่อมต่อกันอย่างมากเช่นเดียวกับมัน การรับargmaxของแต่ละแถวให้ดัชนีของแรกTrueซึ่งเป็นดัชนีของจุดสุดยอดที่เล็กที่สุดในส่วนประกอบ


4

JavaScript (ES6), 125 ไบต์

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))

ทำรายการคู่ชี้นำเป็นอาร์กิวเมนต์ในขณะที่ผลลัพธ์คืออาร์เรย์สำหรับแต่ละจุดยอดที่ให้จุดยอดแรกเชื่อมต่อกับมันอย่างรุนแรงซึ่งฉันเชื่อว่านับเป็นการติดฉลากที่ถูกต้อง ตัวอย่างเช่นด้วยอินพุต[[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, 1, 3, 3, 1, 6, 6, 3](ไม่มีจุดสุดยอด 0; จุดสุดยอด 1, 2 และ 5 มีป้ายกำกับ 1; 3, 4 และ 8 มีป้ายกำกับ 3 ขณะที่ 6 และ 7 มีป้ายกำกับ 6)


4

MATL , 26 22 ไบต์

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

นี้จะใช้วิธีการเดียวกับ@ XNOR ของคำตอบ

ใช้งานได้กับภาษาปัจจุบัน (15.0.0)

อินพุตคือเมทริกซ์ adjacency ของกราฟโดยมีแถวคั่นด้วยเครื่องหมายอัฒภาค กรณีทดสอบแรกและครั้งสุดท้ายคือ

[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]

ลองออนไลน์!

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 ไบต์

.gu+Gs@LQG.{k

สาธิต ,ชุดทดสอบ

อินพุตคือรายการ adjacency ซึ่งแสดงเป็นพจนานุกรมซึ่งแมปจุดยอดกับรายการของจุดยอดที่มีขอบ (เพื่อนบ้านที่กำกับ) เอาต์พุตคือพาร์ติชัน

สาระสำคัญของโปรแกรมคือเราพบชุดของจุดยอดที่สามารถเข้าถึงได้จากจุดสุดยอดแต่ละจุดแล้วจัดกลุ่มจุดยอดตามชุดเหล่านั้น จุดยอดสองจุดใด ๆ ใน SCC เดียวกันมีจุดยอดเดียวกันที่สามารถเข้าถึงได้จากจุดเหล่านี้เพราะแต่ละจุดนั้นสามารถเข้าถึงได้จากจุดอื่น จุดยอดใด ๆ ในส่วนประกอบที่ต่างกันมีชุดที่เข้าถึงได้แตกต่างกันเนื่องจากชุดของทั้งสองนั้นไม่มีชุดอื่น

คำอธิบายรหัส:

.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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.