กราฟ 5 สี


14

พูดตามตรงฉันไม่อยากจะเชื่อเลยว่าสิ่งนี้ยังไม่ได้ถูกถาม แต่ที่นี่คือ

พื้นหลัง

เมื่อพิจารณาจากระนาบที่ไม่ได้บอกทิศทางอย่างง่าย(สามารถวาดกราฟในระนาบที่ไม่มีทางแยก) กราฟมันเป็นทฤษฎีบทที่พิสูจน์แล้วว่ากราฟมีสี 4 สีซึ่งเป็นคำที่เราจะสำรวจในบิต อย่างไรก็ตามมันง่ายกว่าที่จะใช้กราฟ 5 สีซึ่งเป็นสิ่งที่เราจะมุ่งเน้นไปที่ความท้าทายของเราในวันนี้

k-colouring ที่ถูกต้องของกราฟคือการกำหนด "colors" ให้กับโหนดของกราฟที่มีคุณสมบัติดังต่อไปนี้

  1. หากสองโหนดเชื่อมต่อกันด้วยขอบโหนดจะมีสีที่มีสีต่างกัน
  2. ในกราฟมีสีได้สูงสุด 5 สี

เมื่อได้สิ่งนี้ฉันจะนำเสนออัลกอริธึมพื้นฐานสวย ๆ ให้กับ 5 สีกราฟระนาบแบบไม่มีทิศทางใด ๆ อัลกอริทึมนี้ต้องใช้คำจำกัดความต่อไปนี้

ความสามารถเข้าถึงได้: หากโหนด 1 สามารถเข้าถึงได้จากโหนด 2 นั่นหมายความว่ามีลำดับของโหนดแต่ละโหนดเชื่อมต่อกับขอบถัดไปดังนั้นโหนดแรกคือโหนด 2 และสุดท้ายคือโหนด 1 โปรดทราบว่าเนื่องจากกราฟที่ไม่ได้ถูกบอกทิศทาง เป็นแบบสมมาตรหากโหนด 1 สามารถเข้าถึงได้จากโหนด 2 โหนด 2 สามารถเข้าถึงได้จากโหนด 1

Subgraph : กราฟย่อยของกราฟของชุดโหนดที่ระบุ N คือกราฟที่โหนดของกราฟย่อยทั้งหมดใน N และขอบจากกราฟต้นฉบับอยู่ในกราฟย่อยถ้าหากโหนดทั้งสองเชื่อมต่อกันด้วยขอบ อยู่ใน N.

ให้ Color (N) เป็นฟังก์ชั่นกราฟสีระนาบที่มี N nodes 5 สี เรากำหนดฟังก์ชั่นด้านล่าง

  1. ค้นหาโหนดที่มีจำนวนโหนดน้อยที่สุดที่เชื่อมต่ออยู่ โหนดนี้จะมีการเชื่อมต่อได้สูงสุด 5 โหนด
  2. ลบโหนดนี้ออกจากกราฟ
  3. เรียก Color (N-1) บนกราฟใหม่นี้เพื่อระบายสี
  4. เพิ่มโหนดที่ถูกลบกลับไปที่กราฟ
  5. ถ้าเป็นไปได้ให้เพิ่มสีของโหนดที่เพิ่มซึ่งเป็นสีที่ไม่มีโหนดเชื่อมต่ออยู่
  6. หากเป็นไปไม่ได้โหนดทั้งหมด 5 โหนดที่อยู่ใกล้เคียงกับโหนดที่เพิ่มจะมีสีต่างกัน 5 สีดังนั้นเราต้องลองกระบวนการต่อไปนี้
  7. หมายเลขโหนดที่ล้อมรอบโหนดที่เพิ่ม n1 ... n5
  8. พิจารณากราฟย่อยของโหนดทั้งหมดในกราฟต้นฉบับที่มีสีเดียวกันกับ n1 หรือ n3
  9. หากในกราฟย่อยนี้ n3 ไม่สามารถเข้าถึงได้จาก n1 ในชุดของโหนดที่สามารถเข้าถึงได้จาก n1 (รวมถึง n1) ให้แทนที่สี n1 ทั้งหมดด้วย n3's และในทางกลับกัน ตอนนี้สีเพิ่มสีเดิมของโหนด n1
  10. หาก n3 สามารถเข้าถึงได้จาก n1 ในกราฟใหม่นี้ให้ทำกระบวนการจากขั้นตอนที่ 9 บนโหนด n2 และ n4 แทนที่จะเป็น n1 และ n3

ท้าทาย

รับอินพุตของ edgelist (แสดงกราฟ), ระบายสีกราฟโดยกำหนดค่าแต่ละโหนด

อินพุต : รายการขอบในกราฟ (เช่น, [('a','b'),('b','c')...])

โปรดทราบว่าอินพุต edgelist จะเป็นเช่นนั้นหาก (a, b) อยู่ในรายการ (b, a) ไม่อยู่ในรายการ

เอาท์พุท : วัตถุที่มีคู่ของค่าที่องค์ประกอบแรกของแต่ละคู่เป็นโหนดและสีที่สองคือ[('a',1),('b',2)...]หรือ{'a':1,'b':2,...}

คุณสามารถใช้สิ่งใดก็ได้เพื่อแสดงสีตั้งแต่ตัวเลขตัวละครไปจนถึงอย่างอื่น

อินพุตและเอาต์พุตค่อนข้างยืดหยุ่นตราบใดที่ค่อนข้างชัดเจนว่าอินพุตและเอาต์พุตเป็นอย่างไร

กฎระเบียบ

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

กรณีทดสอบ

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

กรณีทดสอบแบบสุ่ม (และค่อนข้างโง่) :

กรณีทดสอบ 2: Krackhardt Kite Graph [(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]

ผลลัพธ์ที่ถูกต้อง: {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

หมายเหตุ : กรณีทดสอบเหล่านี้มีขนาดเล็กเกินไปที่จะทดสอบพฤติกรรมที่เหมาะสมยิ่งขึ้นของอัลกอริธึมการระบายสีดังนั้นการสร้างกราฟของคุณเองน่าจะเป็นการทดสอบความถูกต้องของงานของคุณได้ดี

หมายเหตุ 2 : ฉันจะเพิ่มรหัสอีกส่วนหนึ่งที่จะวาดกราฟโซลูชันสีของคุณในไม่ช้า

หมายเหตุ 3 : ฉันไม่ได้มองข้ามอัลกอริธึมการระบายสีแบบสุ่มที่ได้รับการนำเสนอซึ่งเป็นสิ่งที่ยอดเยี่ยมเกี่ยวกับ PPCG! อย่างไรก็ตามถ้าใครสามารถเล่นกอล์ฟอัลกอริธึมที่กำหนดได้มากกว่านี้


3
ไม่ใช่ Petersen และ Chvatal กราฟ nonplanar ใช่ไหม
Kroppeb

1
@NicHartley มีการดำเนินการตามทรานสเลชั่นที่รู้จักกันดีในเมทริกซ์ adjacency ที่มีประสิทธิภาพกราฟสี ฉันจะแนบกระดาษเมื่อฉันพบ
Don Thousand

1
ฉันคิดว่าคุณน่าจะดีกว่าการ จำกัด การแก้ปัญหาเวลาพหุนามหรือต้องใช้กรณีทดสอบขนาดใหญ่เพื่อให้ทำงานได้สำเร็จเพื่อบังคับให้โซลูชันใช้กราฟอัลกอริธึมแบบที่คุณคิด
xnor

2
@ xnor ดูเหมือนว่าฉันจะได้เรียนรู้บทเรียนของฉัน ไม่เป็นไร! การคิดนอกกรอบควรได้รับรางวัลไม่ใช่การลงโทษ
Don Thousand

1
ใช่ฉันรู้ แต่เป็นคำถามที่ 4 สีจะต้องได้รับการออกแบบในลักษณะดังกล่าวว่าคนไม่สามารถใช้เวลาเพียงแค่คำตอบของคำถามนี้เปลี่ยนแปลง5ไป4, และส่งพวกเขา
Peter Taylor

คำตอบ:


6

Python 2 , 96 ไบต์

i=0
g=input()
while 1:i+=1;c={k:i/4**k%4for k in sum(g,())};all(c[s]^c[t]for s,t in g)>0<exit(c)

ลองออนไลน์!

ก.ผม

อินพุตคือภาพถ่ายดังนั้นการค้นหา 4 สีจึงเป็นไปได้เสมอ

(ดังนั้น: สิ่งนี้ค้นหาสีที่เก่าแก่ที่สุดของคำในแง่หนึ่งและทำให้ไม่มีประสิทธิภาพมาก)

kผม4kพอควร4kผม


ความพยายามดี แต่ฉันเชื่อว่าคุณขาดองค์ประกอบหนึ่งไป สิ่งที่เกี่ยวกับกรณีที่โหนดล้อมรอบด้วย 5 สีที่แตกต่างกันอย่างไร
Don Thousand

ฉันจะพยายามสร้างกรณีทดสอบเพื่อทำลายสิ่งนี้
ดอนพัน

สมมติว่าโหนดที่ระบุในกราฟของคุณล้อมรอบด้วย 5 โหนดอื่น ๆ ซึ่งคุณได้ระบายสี 5 สีที่คุณได้รับอนุญาตแล้ว
Don Thousand

1
รหัสของฉันจะสร้างสีกราฟแบบสุ่มและตรวจสอบจนกว่ามันจะสร้างสีกราฟที่ถูกต้องซึ่งมันจะพิมพ์เมื่อออกจาก ในกรณีที่คุณอธิบายว่าจะเริ่มต้นใหม่และหวังว่าจะไม่ให้สีทั้ง 5 โหนดทั้ง 5 สีที่มี
Lynn

2
ตอนนี้มันจะตรวจสอบสีทั้งหมดตามลำดับพจนานุกรม :) ดังนั้นมันจึงกำหนดไว้และ O (5 ^ n) แต่ช้าลงมากสำหรับอินพุตส่วนใหญ่
Lynn

3

JavaScript (ES7), 80 76 74 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Neil

วิธีการเช่นเดียวกับลินน์ แก้ 4 สีจำนวนจาก0ที่จะ3

a=>{for(x=0;a.some(a=>a.map(n=>z=c[n]=x>>n*2&3)[0]==z,c={});x++);return c}

ลองออนไลน์!


หากคุณได้รับอนุญาตให้ใช้สีสี่สีแล้วทำไมx>>n+n&3ล่ะ
Neil

@ Neil Ah ใช่ขอบคุณ ฉันได้ฟุ้งซ่านโดยคำอธิบายเกี่ยวกับ 5 สีและลืมข้อมูลที่ได้รับการรับรองว่าจะสามารถแก้ไขได้ใน 4
Arnauld

3

Brachylogขนาด 38 ไบต์

cd{∧4>ℕ}ᶻ.g;?z{tT&h⊇ĊzZhpT∧Zt≠}ᵐ∧.tᵐ≜∧

ลองออนไลน์!

คำอธิบาย

Example input: [["a","b"],["c","b"]]

cd                                       Concatenate and remove duplicates: ["a","b","c"]
  {∧4>ℕ}ᶻ.                               The output is this list zipped zith integers that
                                           are in [0..4]: [["a",I],["b",J],["c",K]]
         .g;?z                           Zip the output with the input:
                                           [[[["a",I],["b",J],["c",K]],["a","b"]],[["a",I],["b",J],["c",K]],["c","b"]]
              {               }ᵐ∧        Map for each element
               tT                        Call T the couple of nodes denoting an edge
                 &h⊇Ċ                    Take a subset of 2 elements in the head
                     zZ                  Zip and call it Z
                      ZhpT               The nodes in Z are T up to a permutation
                          ∧Zt≠           The integers in Z are all different color
                                 .tᵐ≜∧   Label the integers (i.e. colors) in the output so that
                                           it matches the set constraints

1

Python 2 , 211 ไบต์

def f(g):
 g={k:[(a,b)[a==k]for a,b in g if k in(a,b)]for k in sum(g,())};c={k:0 for k in g}
 for a,b in sorted(g.iteritems(),key=lambda a:len(a[1])):c={k:(c[k],c[k]+1)[c[a]==c[k]and k in b]for k in c}
 return c

ลองออนไลน์!

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



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