ทำ NP: หากลุ่มที่ใหญ่ที่สุด


22

พื้นหลัง

ในขณะที่เขียนสิ่งนี้ปัญหา P vs NP ยังไม่ได้รับการแก้ไข แต่คุณอาจเคยได้ยินบทความใหม่ของNorbert Blum ที่อ้างว่าเป็นหลักฐานพิสูจน์ว่า P! = NP ซึ่งเป็นที่สงสัยกันว่าผิดพลาด (แต่เราจะเห็น)

ปัญหาที่กล่าวถึงในบทความนี้เป็นปัญหากลุ่มพรรคพวก อย่างน้อยนั่นคือสิ่งที่ฉันอ่านในบทความในหนังสือพิมพ์ดังนั้นให้แก้ไขฉันถ้าฉันผิด แต่ไม่ว่าในกรณีใดฉันต้องการให้คุณเขียนโปรแกรมที่ช่วยแก้ไขตัวแปรต่อไปนี้:

งาน

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

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

หากคุณชอบคำศัพท์ทางคณิตศาสตร์หมายความว่าคุณได้รับขอบของกราฟที่ไม่ได้บอกทิศทางโดยแต่ละโหนดมีสองโหนด

อินพุต

[[1,2],[2,5],[1,5]]การป้อนข้อมูลของคุณจะเป็นรายการที่ไม่ว่างเปล่าของคู่จำนวนเต็มบวกเช่น คุณสามารถรับอินพุตนี้ในรูปแบบที่เหมาะสมเช่นเป็นอาร์เรย์ของอาร์เรย์เป็นบรรทัดของข้อความที่มีตัวเลขสองตัวต่อกัน ฯลฯ ...

เอาท์พุต

ผลลัพธ์ที่คาดหวังคือตัวเลขเดียวn >= 2: ขนาดของกลุ่มที่ใหญ่ที่สุด ด้วยตัวอย่างเช่นการป้อนข้อมูลดังกล่าวข้างต้นผลจะเป็น3เช่นเดียวกับนักเรียนทุกคน ( 1, 2และ5) เป็นเพื่อนกับแต่ละอื่น ๆ

กรณีทดสอบ

[[1,2]]
=> 2

[[1,2],[3,1],[3,4]]
=> 2

[[1,2],[2,5],[1,5]]
=> 3

[[2,5],[2,3],[4,17],[1,3],[7,13],[5,3],[4,3],[4,1],[1,5],[5,4]]
=> 4 (the largest clique is [1,3,4,5])

[[15,1073],[23,764],[23,1073],[12,47],[47,15],[1073,764]]
=> 3 (the largest clique is [23,764,1073])

[[1296,316],[1650,316],[1296,1650],[1296,52],[1650,711],[711,316],[1650,52],
 [52,711],[1296,711],[52,316],[52,1565],[1565,1296],[1565,316],[1650,1565],
 [1296,138],[1565,138],[1565,711],[138,1650],[711,138],[138,144],[144,1860],
 [1296,1860],[1860,52],[711,1639]]
=> 6 (the largest clique is [52,316,711,1296,1565,1650])

คุณสามารถใช้การอ้างอิงนี้ (โง่) (พิมพ์เอาต์พุตพิเศษด้วย-dแฟล็ก) เพื่อตรวจสอบผลลัพธ์ของกรณีทดสอบอื่น ๆ

กฎระเบียบ

  1. โปรแกรมของคุณไม่ต้องการผลลัพธ์ที่กำหนดจากอินพุตที่ไม่ถูกต้อง ดังนั้นคุณสามารถสันนิษฐานได้ว่า:
    • คุณจะได้รับID อย่างน้อยหนึ่งคู่เสมอ
    • แต่ละคู่ประกอบด้วยสอง ID ที่แตกต่างกัน
    • ไม่มีคู่ปรากฏขึ้นสองครั้ง (การสลับตำแหน่งของรหัสจะยังคงเป็นคู่เดียวกัน)
  2. อัลกอริทึมของคุณไม่ได้รับอนุญาตให้ตั้งค่าขอบเขตบนของขนาดอินพุต ข้อ จำกัด ทางเทคนิคอย่างแท้จริงและข้อ จำกัด ที่กำหนดโดยภาษา / สภาพแวดล้อมของคุณ (เช่นขนาดสแต็คเวลาคำนวณ ฯลฯ ) แน่นอนว่าหลีกเลี่ยงไม่ได้
  3. ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  4. นี่คือดังนั้นโค้ดที่สั้นที่สุดที่วัดเป็นไบต์จะเป็นผู้ชนะ
  5. หากอัลกอริทึมของคุณมีความซับซ้อนของเวลาพหุนามคุณจะให้คะแนน-1ทันทีโดยไม่คำนึงถึงขนาดของโค้ด แต่ในกรณีนี้คุณอาจต้องการส่งโซลูชันของคุณไปที่อื่น ;)

4
ฉันเกือบจะรับประกันได้ว่าจะมีคนที่จะทำ (หรือพยายาม) ดังนั้นมันจะปลอดภัยกว่าที่จะลบออก หากคุณต้องการคนที่ได้รับรางวัลสำหรับการทำเช่นนั้นคุณสามารถมีเงินรางวัลให้กับคำตอบที่สั้นที่สุดที่ไม่ได้มันเวลาพหุนาม
caird coinheringaahing

4
@cairdcoinheringaahing ถ้ามีคนไม่มัน-1เป็นดีสมควร ;)
เฟลิกซ์ Palmen

13
@cairdcoinheringaahing หากใครบางคนจัดการเพื่อพิสูจน์ว่า P = NP พวกเขามีคะแนนต่ำสุดโดยอัตโนมัติเกี่ยวกับปัญหารหัสกอล์ฟเป็นสิ่งที่เรากังวลน้อยที่สุด ที่กล่าวว่ากฎข้อ 5 ไม่ได้มีส่วนช่วยในการท้าทายมากนักดังนั้นฉันจึงเห็นด้วยว่าควรลบออก
Mego

11
@Mego มันเป็นเพียงแค่เรื่องตลกและโบนัสเล็ก ๆ ให้กับ 1M ที่ CMI นำเสนอ
เฟลิกซ์ Palmen

30
ฉันจะไม่ชอบคนไม่กี่คนที่มีอารมณ์ขัน "วิทยาศาสตร์" กรุณาอย่าแสดงความคิดเห็นข้อเสนอแนะเพิ่มเติมเกี่ยวกับเรื่องนี้ขอบคุณ :)
เฟลิกซ์ Palmen

คำตอบ:


6

เยลลี่ ,  15 18  16 ไบต์

+3 ไบต์เพื่อแก้ไขข้อบกพร่องในวิธีการของฉัน
-2 ไบต์ขอบคุณไมล์ (สังเกตได้ว่าn × (n-1) ÷ 2 = nC2 )

ẎQL©c2⁼Lȧ®
ŒPÇ€Ṁ

ลิงก์ monadic ที่ใช้รายการมิตรภาพ (ขอบ) และส่งคืนจำนวนเต็ม

ลองออนไลน์! รูปแบบชุดพลังงานของขอบในหน่วยความจำจึงไม่มีประสิทธิภาพทั้งในพื้นที่และเวลา (ใช่นั่นคือ O (2 n )คน!)

อย่างไร?

ẎQL©c2⁼Lȧ® - Link 1, isClique?: list, edges  e.g. [[1,3],[2,3],[3,4],[4,1],[4,2],[2,1]]
Ẏ          - tighten                              [ 1,3 , 2,3 , 3,4 , 4,1 , 4,2 , 2,1 ]
 Q         - de-duplicate (gets unique ids)          [1,3,2,4]
  L        - length (get number of people involved)  4
   ©       - (copy to the register)
    c2     - combinations of 2 (z-choose-2)          6
       L   - length (of edges)                       6
      ⁼    - equal?                                  1
         ® - recall value from register              4
        ȧ  - logical and                             4
           - (Note: the number of edges of a clique of size n is n*(n-1) and we're
           -  guaranteed no repeated edges and that all edges are two distinct ids)

ŒPÇ€Ṁ - Link: list of lists, edges
ŒP    - power-set (all possible sets of edges (as lists))
  Ç€  - call last link (1) as a monad for €ach
    Ṁ - maximum

ว้าวโปรดอธิบายเมื่อคุณมีเวลา
มิสเตอร์ Xcoder

@EriktheOutgolfer ฉันเห็นด้วย ฉันอาจจะเพิ่มรหัสเพื่อกอบกู้ ...
Jonathan Allan

ขอให้เรายังคงอภิปรายนี้ในการแชท
Erik the Outgolfer


@miles - ดีฉันเพิ่งใช้เวลาสักพักเพื่อรับ 15 คะแนนฉันรู้สึกว่ามันน่าจะเป็นไปได้!
Jonathan Allan

13

Mathematica, 34 ไบต์

Tr[1^#&@@FindClique[#<->#2&@@@#]]&  

โดยทั่วไปFindCliqueทำงานและ "ค้นหากลุ่มที่ใหญ่ที่สุดในกราฟ g"
สิ่งอื่น ๆ ทั้งหมดคือการแปลงรายการอินพุตเป็นกราฟ

อินพุต

[{2, 5}, {2, 3}, {4, 17}, {1, 3}, {7, 13}, {5, 3}, {4, 3}, {4, 1}, {1, 5}, {5, 4}}]

เอาท์พุต

4

อินพุต

[{1296, 316}, {1650, 316}, {1296, 1650}, {1296, 52}, {1650, 711}, {711, 316}, {1650, 52}, {52, 711}, {1296, 711}, {52, 316}, {52, 1565}, {1565, 1296}, {1565, 316}, {1650, 1565}, {1296, 138}, {1565, 138}, {1565 , 711}, {138, 1650}, {711, 138}, {138, 144}, {144, 1860}, {1296, 1860}, {1860, 52}, {711, 1639}}]

เอาท์พุต

6

thanx @Kelly Lowder สำหรับ -10 ไบต์


23
แน่นอน Mathematica มี builtin สำหรับสิ่งนี้
Erik the Outgolfer

1
กำจัด 10 ไบต์ด้วยTr[1^#&@@FindClique[#<->#2&@@@#]]&
Kelly Lowder

12
FindCliqueಠ ___ ಠ
Mr. Xcoder

6

เยลลี่ , 20 ไบต์

ŒPẎ€µQL’=ċЀ`ẠµÐfṪQL

ลองออนไลน์!

แน่นอนว่านี่ไม่สมควรได้รับเงินล้าน: p

นี้จะได้ชนะ Pyth หากไม่ได้สำหรับ2µ(...)µ ไบต์Ðf


น่าอัศจรรย์ ฉันอาจจะยอมแพ้เช่นกัน
มาร์คโธมัส

@FelixPalmen กำลังดุร้าย: p
Erik the Outgolfer

@EriktheOutgolfer ฉันไม่ได้ตั้งใจรันไทม์ของรหัส;)
เฟลิกซ์ Palmen

@ FelixPalmen ฉันหมายถึงวิธีการกำลังดุร้ายไม่จำเป็นต้องคิดอะไรมาก: p
Erik the Outgolfer

ให้MemoryErrorกับกรณีทดสอบที่ใหญ่ที่สุด :( แน่นอนว่ายังมีผลบังคับใช้นี่เป็น "ข้อ จำกัด ทางเทคนิค" - แต่จากความอยากรู้อยากรู้อยากเห็นมีวิธีการเพิ่มทรัพยากรที่มีกับเยลลี่หรือไม่
Felix Palmen

3

J , 36 ไบต์

[:>./](#(]*[=2!])#@~.@,)@#~2#:@i.@^#

ลองออนไลน์!

ทำงานได้ทันเวลา O (2 n ) โดยที่nคือจำนวนคู่

วิธีที่เร็วกว่าสำหรับ 65 ไบต์คือ

3 :'$>{._2{~.@((+.&(e.&y)&<|.)@(-.,-.~)&>/#&,/:~@~.@,&.>/)~^:a:y'

ลองออนไลน์!

คำอธิบาย

[:>./](#(]*[=2!])#@~.@,)@#~2#:@i.@^#  Input: list of pairs
                                   #  Length
                           2      ^   2^n
                               i.@    Range [0, 2^n)
                            #:@       Binary
                         #~           Copy
      (                )@             For each
                      ,                 Flatten
                   ~.@                  Unique
                 #@                     Length
        (       )                       Dyad with RHS at previous and LHS as next
               ]                          Get RHS
             2!                           Binomial coefficient, choose 2
            =                             Equals
           [                              Get LHS
          *                               Times
         ]                                Get RHS
       #                                Length
[:>./                                 Reduce using maximum


2

Python 2 , 180 ไบต์

G=input()
m=0
L=len
for i in range(2**L(G)):
 u=[];p=sum([G[j]for j in range(L(G))if 2**j&i],u)
 for j in p:u+=[j][j in u:]
 m=max(m,L(u)*all(p.count(j)==L(u)-1for j in u))
print m

ลองออนไลน์!

-2 ขอบคุณที่shooqie
-1 ขอบคุณที่นาย Xcoder
-3 ขอบคุณซ้ำแล้วซ้ำอีก


คุณสามารถบันทึกสองไบต์โดยกำหนดให้lenกับตัวแปร
shooqie

183 ไบต์ วิธี(x not in y) 0**(x in y)
Mr. Xcoder

@ Mr.Xcoder ฉันรู้ว่ามีวิธีที่สั้นลง! ขอบคุณ!
Erik the Outgolfer

ฉันไม่เคยใช้มันมาก่อนเป็นเพียงกลอุบายที่ข้ามผ่านความคิดของฉันไปเมื่อสองสามวันก่อน แต่ยังไม่สามารถใช้ประโยชน์ได้
Mr. Xcoder

@ Mr.Xcoder ไม่เป็นไรถ้ามันใช้งานได้ทำไมล่ะ? : D BTW คุณยังสามารถแทนที่ด้วย0** -~-
Erik the Outgolfer

1

Pyth, 28 ไบต์

l{sSef<T.{SMQm.{ft{T.Cd2yS{s

ลองออนไลน์

คำอธิบาย

l{sSef<T.{SMQm.{ft{T.Cd2yS{s
                         S{sQ  Get the distinct nodes in the (implicit) input.
                        y      Take every subset.
             m      .Cd2       Get the pairs...
                ft{T           ... without the [x, x] pairs...
              .{               ... as sets.
     f<T                        Choose the ones...
        .{  Q                   ... which are subsets of the input...
          SM                    ... with edges in sorted order.
    e                           Take the last element (largest clique).
l{sS                            Get the number of distinct nodes.

1

Python 3 , 162 159 ไบต์

lambda x,f=lambda x:{i for s in x for i in s}:len(f(x))if all([(y,z)in x or(z,y)in x for y in f(x)for z in f(x)if y<z])else max(c(x.difference({y}))for y in x)

ลองออนไลน์!

ฟังก์ชัน c รับจุดยอดในรูปแบบของชุดของtuples ที่เรียงลำดับ ({(x, y), ... } โดยที่ x น้อยกว่า y) ฟังก์ชั่นที่เรียกว่า "รายการ" อยู่ในส่วนหัว TIO เพื่อทดสอบกับข้อมูลในรายชื่อของรูปแบบรายการที่ไม่ได้เรียงลำดับ ถ้า clique ส่งคืนความยาว ถ้าไม่ใช่ clique ให้ส่งคืนขนาดของจุดสูงสุดสูงสุดลบจุดยอดสำหรับแต่ละจุดยอดในจุดยอด เกินเวลาในกรณีทดสอบล่าสุดใน TIO

อัปเดต: "หรือ (z, y) ใน x" เพิ่มส่วนเพื่อลบการอ้างอิงในการเรียงลำดับ "f = lambda x: {i สำหรับ s ใน x สำหรับ i ใน s}" แทน itertools.chain ที่ห่อในชุด

- น้อยกว่า 3 ไบต์ด้วย @Jonathan Allen


1
คุณอาจจะไม่ถือว่าการป้อนข้อมูลที่ขอบจะเรียง
Jonathan Allan

นอกจากนี้ - คุณไม่จำเป็นต้องตั้งชื่อcดังนั้นสามารถลบได้c=(คุณจะต้องใส่c=\ที่ส่วนท้ายของส่วนหัวและวางlambdaที่ด้านบนสุดของบล็อกรหัสสำหรับ TIO)
Jonathan Allan

นอกจากนี้คุณสามารถกำจัดsและแทนที่s(...)ด้วยการ{*...}อนุญาตให้มีการลบช่องว่างด้วย
Jonathan Allan

1
@Janathan ทุกอย่างขอบคุณคงที่ sortness
Conner Johnston


1

เยลลี่ขนาด 28 ไบต์

œ^e³;U¤
Œcç/Ðfœ|Ṣ¥/€QµÐĿ-ịḢL

ลองออนไลน์!

วิธีแก้ปัญหาที่เร็วกว่าที่สามารถแก้ไขกรณีทดสอบล่าสุดในหนึ่งวินาทีบน TIO


แล้วมันมีความซับซ้อนอะไรบ้าง? ถ้ามันต่ำกว่าO (2ⁿ)ก็สมควรได้รับ $ 1,000,000
Erik the Outgolfer

1
@EriktheOutgolfer คุณผิดมีอัลกอริทึมที่มีรันไทม์O (1.1888ⁿ)
rus9384

เพิ่มไปที่จะมีมูลค่าเป็นล้านที่nอาจปรากฏในฐาน :)
เฟลิกซ์ Palmen

@ FelixPalmen หรือไม่สามารถ อย่างไรก็ตามสำหรับงบหนึ่งล้านสองต้องพิสูจน์
rus9384

1
ฉันเชื่อว่านี่คือ O (1.414 ^ n) คุณสามารถดูประสิทธิภาพที่แย่ลงเมื่ออินพุตเป็นกราฟที่สมบูรณ์
ไมล์

1

Java + Guava 23.0, 35 + 294 = 329 ไบต์

import com.google.common.collect.*;
a->{int l=0,o=1,c,z=a.size();for(;o>0&l<z;){o=0;c:for(Iterable<int[]>s:Sets.combinations(a,l*(l+1)/2)){Multiset<Integer>m=TreeMultiset.create();for(int[]x:s){m.add(x[0]);m.add(x[1]);}c=m.elementSet().size();for(int e:m.elementSet())if (m.count(e)!=c-1)continue c;l+=o=1;break;}}return z<3?2:l;}

อัลกอริทึมนี้ไม่ได้สร้างกราฟ แต่เป็นการสร้างชุดค่าผสมของคู่ขนาดทั้งหมดแทน ฉันป้อนชุดค่าผสมคู่ทั้งหมดลงในชุดค่าผสมและตรวจสอบว่าชุดค่าผสมเหล่านั้นมีขนาดที่คาดหวัง (จำนวนรายการที่ไม่ซ้ำ - 1) ถ้าพวกเขาทำฉันก็พบกลุ่มหนึ่งและไปหาคนที่ใหญ่กว่านี้

จากห้องสมุด Guava ฉันใช้combinationsวิธีการใหม่และประเภทของชุดเครื่องมือMultisetวิธีการและเครื่องมือในการเก็บรวบรวมชนิด

Ungolfed

import com.google.common.collect.*;
import java.util.function.*;

public class Main {

  public static void main(String[] args) {
    ToIntFunction<java.util.Set<int[]>> f
        = a -> {
          int l = 0, o = 1, c, z = a.size();
          for (; o > 0 & l < z;) {
            o = 0;
            c:
            for (Iterable<int[]> s : Sets.combinations(a, l * (l + 1) / 2)) {
              Multiset<Integer> m = TreeMultiset.create();
              for (int[] x : s) {
                m.add(x[0]);
                m.add(x[1]);
              }
              c = m.elementSet().size();
              for (int e : m.elementSet()) {
                if (m.count(e) != c - 1) {
                  continue c;
                }
              }
              l += o = 1;
              break;
            }
          }
          return z < 3 ? 2 : l;
        };
    int[][][] tests = {
      {{1, 2}},
      {{1, 2}, {3, 1}, {3, 4}},
      {{1, 2}, {2, 5}, {1, 5}},
      {{2, 5}, {2, 3}, {4, 17}, {1, 3}, {7, 13}, {5, 3}, {4, 3}, {4, 1}, {1, 5}, {5, 4}},
      {{15, 1073}, {23, 764}, {23, 1073}, {12, 47}, {47, 15}, {1073, 764}},
      {{1296, 316}, {1650, 316}, {1296, 1650}, {1296, 52}, {1650, 711}, {711, 316}, {1650, 52}, {52, 711}, {1296, 711}, {52, 316}, {52, 1565}, {1565, 1296}, {1565, 316}, {1650, 1565}, {1296, 138}, {1565, 138}, {1565, 711}, {138, 1650}, {711, 138}, {138, 144}, {144, 1860}, {1296, 1860}, {1860, 52}, {711, 1639}}
    };
    for (int[][] test : tests) {
      java.util.Set<int[]> s = new java.util.HashSet<int[]>();
      for (int[] t : test) {
        s.add(t);
      }
      System.out.println(f.applyAsInt(s));
    }
  }
}

ฉันจะประหลาดใจมากเห็นการค้นหากลุ่มโบราณสูงสุดในกราฟตามอำเภอใจ - แต่มันจะใช้เวลาสักครู่ในการวิเคราะห์รหัสนี้ฉันไม่คุ้นเคยกับ Java :)
Felix Palmen

@ FelixPalmen ฉันชอบความท้าทายนี้ดังนั้นคำตอบของฉันจะคงอยู่ไม่ว่าจะเกิดอะไรขึ้น แต่ฉันก็โอเคกับการลบ "-1" ออกไปถ้ามันไม่ใช่ความซับซ้อนแบบพหุนาม ถ้าอย่างนั้นฉันควรจะไปทบทวนหนังสือบางเล่ม: P
Olivier Grégoire

"การรวมขนาดxเป็นพหุนาม " <- คุณแน่ใจเหรอ ผมคิดว่านั่นเป็นวิธีการที่ใช้ ค่าส่งคืนคือAbstractSetพร้อมตัววนซ้ำและการforวนซ้ำต่อไปนี้จะเรียกว่าตัววนซ้ำx!ครั้งนี้หากฉันไม่ผิด ...
เฟลิกซ์พาเล็ม

การแก้ไข: ตราบใดที่x < n(ด้วยnขนาดที่สมบูรณ์ของชุดอินพุต) มันn!/(x!(n-x)!)ยังคงไม่ใช่พหุนาม :)
เฟลิกซ์ Palmen

@FelixPalmen คุณมีสิทธิ์มากที่สุด นอกจากนี้คุณกำลังบอกว่าถ้าฉันทำcombinationsวิธีที่X^n(ซึ่งเป็นไปได้ทั้งหมด) ฉันจะได้รับหรือไม่ ในขณะเดียวกันฉันลบข้อเรียกร้องของ "-1"
Olivier Grégoire


0

รหัสเครื่อง 6502 (C64), 774 703 ไบต์

(ฉันต้องทำสิ่งนี้ C64 ของฉันสามารถทำทุกอย่างได้ ... ฮิ)

hexdump:

00 C0 A9 00 A2 08 9D 08 00 CA 10 FA A2 04 9D FB 00 CA 10 FA 20 54 C0 B0 20 AD 
C9 C2 AE CA C2 20 92 C1 B0 31 8D 31 C0 AD CB C2 AE CC C2 20 92 C1 B0 23 A2 FF 
20 FE C1 90 DB 20 6A C2 20 C1 C1 B0 05 20 6A C2 50 F6 A5 FB 8D D3 C2 20 43 C1 
A9 CD A0 C2 20 1E AB 60 A2 00 86 CC 8E 61 C0 20 E4 FF F0 FB A2 FF C9 0D F0 10 
E0 0B 10 0C 9D BD C2 20 D2 FF E8 8E 61 C0 D0 E5 C6 CC A9 20 20 D2 FF A9 0D 20 
D2 FF A9 00 9D BD C2 AA BD BD C2 F0 5C C9 30 30 0E C9 3A 10 0A 9D CD C2 E8 E0 
06 F0 4C D0 E9 C9 20 D0 46 A9 00 9D CD C2 E8 8E BC C0 20 EB C0 AD D3 C2 8D C9 
C2 AD D4 C2 8D CA C2 A2 FF A0 00 BD BD C2 F0 0F C9 30 30 21 C9 3A 10 1D 99 CD 
C2 C8 E8 D0 EC A9 00 99 CD C2 20 EB C0 AD D3 C2 8D CB C2 AD D4 C2 8D CC C2 18 
60 38 60 A2 FF E8 BD CD C2 D0 FA A0 06 88 CA 30 0A BD CD C2 29 0F 99 CD C2 10 
F2 A9 00 99 CD C2 88 10 F8 A9 00 8D D3 C2 8D D4 C2 A2 10 A0 7B 18 B9 53 C2 90 
02 09 10 4A 99 53 C2 C8 10 F2 6E D4 C2 6E D3 C2 CA D0 01 60 A0 04 B9 CE C2 C9 
08 30 05 E9 03 99 CE C2 88 10 F1 30 D2 A2 06 A9 00 9D CC C2 CA D0 FA A2 08 A0 
04 B9 CE C2 C9 05 30 05 69 02 99 CE C2 88 10 F1 A0 04 0E D3 C2 B9 CE C2 2A C9 
10 29 0F 99 CE C2 88 10 F2 CA D0 D9 C8 B9 CD C2 F0 FA 09 30 9D CD C2 E8 C8 C0 
06 F0 05 B9 CD C2 90 F0 A9 00 9D CD C2 60 85 0A A4 09 C0 00 F0 11 88 B9 D5 C2 
C5 0A D0 F4 8A D9 D5 C3 D0 EE 98 18 60 A4 09 E6 09 D0 01 60 A5 0A 99 D5 C2 8A 
99 D5 C3 98 99 D5 C4 18 60 A6 0B E4 09 30 01 60 BD D5 C5 C5 0B 30 09 A9 00 9D 
D5 C5 E6 0B D0 E9 A8 FE D5 C5 8A 29 01 D0 02 A0 00 BD D5 C4 59 D5 C4 9D D5 C4 
59 D5 C4 99 D5 C4 5D D5 C4 9D D5 C4 A9 00 85 0B 18 60 A8 A5 0C D0 08 A9 20 C5 
0D F0 21 A5 0C 8D 1E C2 8D 21 C2 A5 0D 09 60 8D 1F C2 49 E0 8D 22 C2 8C FF FF 
8E FF FF E6 0C D0 02 E6 0D 18 60 86 0E 84 0F A5 0D 09 60 8D 54 C2 49 E0 8D 5F 
C2 A6 0C CA E0 FF D0 10 AC 54 C2 88 C0 60 10 02 18 60 8C 54 C2 CE 5F C2 BD 00 
FF C5 0E F0 04 C5 0F D0 E0 BD 00 FF C5 0E F0 04 C5 0F D0 D5 38 60 A2 00 86 FC 
86 FD 86 FE BD D5 C4 A8 A6 FE E4 FC 10 11 BD D5 C7 AA 20 2B C2 90 14 E6 FE A6 
FE E4 FC D0 EF A6 FD BD D5 C4 A6 FC E6 FC 9D D5 C7 E6 FD A6 FD E4 09 D0 16 A6 
FB E4 FC 10 0F A2 00 BD D5 C7 9D D5 C6 E8 E4 FC D0 F5 86 FB 60 A0 00 84 FE F0 
B5

การสาธิตออนไลน์

การใช้งาน: เริ่มต้นด้วยsys49152จากนั้นป้อนคู่ละหนึ่งบรรทัดเช่นเช่น

15 1073
23 764
23 1073
12 47
47 15
1073 764

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

นี้มีขนาดใหญ่เกินไปที่จะโพสต์อธิบายการถอดชิ้นส่วนรายชื่อที่นี่ แต่คุณสามารถเรียกดูแหล่งที่มาชุมนุม ca65 สไตล์ อัลกอริทึมไม่มีประสิทธิภาพมากมันสร้างการเรียงสับเปลี่ยนที่เป็นไปได้ของโหนดและด้วยความละโมบเหล่านี้สร้างกลุ่มโดยการตรวจสอบขอบทั้งหมด นี้จะช่วยให้ประสิทธิภาพการใช้พื้นที่ของO (n) (ชนิดของสำคัญในเครื่องที่มี RAM น้อยนี้) แต่มีที่น่ากลัว ประสิทธิภาพรันไทม์ (*) ข้อ จำกัด ทางทฤษฎีมีมากถึง 256 โหนดและสูงถึง 8192 edge

  • -71 ไบต์: รูทีนที่เหมาะสำหรับการตรวจสอบขอบและการใช้งาน zeropage

มีรุ่นที่ใหญ่กว่า ( 883 805 ไบต์) พร้อมคุณสมบัติที่ดีกว่า:

  • ข้อเสนอแนะภาพในระหว่างการคำนวณ (การเปลี่ยนแปลงของโหนดเปลี่ยนสีของเส้นขอบ)
  • ใช้การสลับธนาคารเพื่อจัดเก็บขอบใน RAM "ซ่อน" โดย ROMs เพื่อประหยัดพื้นที่
  • ส่งออกขนาดและโหนดของกลุ่มสูงสุดที่พบ

การสาธิตออนไลน์

ค้นหาแหล่งที่มา


(*)กรณีทดสอบครั้งสุดท้ายใช้เวลาประมาณ 12 ถึง 20 ชั่วโมง (ฉันนอนหลับเมื่อมันเสร็จ) อีกกรณีทดสอบจบที่เลวร้ายที่สุดภายในไม่กี่นาที

Screenshot of last test case

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