สวัสดีครับๆ อันนี้ก็เป็น blog post อันแรกใน ThailandOI ของผม ถ้าอ่านแล้วมีข้อติชมตรงไหนก็โพสต์บอกใน comment ด้วยละกันนะครับ
SCC เป็นอีก algorithm นึงที่มีประโยชน์ในการจัดการกับกราฟ แม้จะพบไม่บ่อยในข้อสอบ แต่ก็ควรจะรู้จักและใช้ให้เป็น ในบทความนี้จะแนะนำ SCC และมี psuedocode ให้ พร้อมทั้งตัวอย่างการเอาไปใช้แก้ปัญหา
SCC (Strongly Connected Component) ตามนิยามก็คือกลุ่มของ node ใน directed graph โดยที่ทุก node i,j ใดๆ ในนั้น สามารถไปหากันได้
สามารถอ่านเพิ่มเติมได้จาก บทความ Strongly Connected Component ในวิกิพีเดีย
เพราะเมื่อเราทำ SCC กับ directed graph (คือการจัดกลุ่ม node เป็น กลุ่มๆ โดยที่แต่ละกลุ่มเป็น SCC ที่มีขนาดใหญ่ที่สุด) และแปลงแต่ละกลุ่มนั้นให้เป็น node เราจะได้ directed acyclic graph (DAG = กราฟมีทิศทางที่ไม่มี cycle) ซึ่งสามารถแก้ปัญหาได้ง่ายกว่า directed graph ธรรมดาที่มี cycle มาก กระบวนการแปลง directed graph ให้กลายเป็น dag เรียกว่า condensation
(ภาพจากวิกิพีเดีย)
จากภาพ มีกราฟอยู่ ในส่วนที่อยู่ในสีเทาเดียวกัน คืออยู่ใน SCC เดียวกัน ซึ่งเมื่อเรา condense กราฟนี้แล้ว จะเหลือแค่ 3 node
คือ
,
และ
และมี edge จาก
->
และ
-> 
โหลดได้ที่นี่
สำหรับโจทย์ข้อนี้ มี directed graph ที่แต่ละ node มีเงินอยู่ กำหนดจุดเริ่มต้น และ จุดจบที่เป็นไปได้ (มีหลายจุด) จะเดินอย่างไรให้เริ่มจากจุดเริ่มต้นนั้น และจบในจุดจบใดๆ ที่มีให้ แล้วเก็บเงินบน node มากที่สุด (เดิน node ซ้ำไม่ได้เงินเพิ่ม)
จากข้อนี้ หลายคนตอนเห็นโจทย์ ถ้าไม่รู้จัก SCC มาก่อนอาจจะเริ่มรู้สึกแบบ WTF? เพราะกราฟมีทั้ง cycle มีทั้งจบได้หลายที่ อ๊ากกกกกก
แต่ว่า ถ้าเกิดกราฟนี้เป็น DAG (พูดง่ายๆคือ เอา cycle ออกไป) ล่ะ? ง่ายขึ้นละเปล่า ถ้าทำได้ BFS รอบเดียวก็จบ หรือ DFS แบบ Dynamic รอบเดียวก็จบ ใครที่ไม่รู้ว่า dynamic ยังไง ลองอ่านที่ Dynamic Programming 2
ถ้าเกิดการทำให้กราฟนี้เป็น DAG แล้วแก้ง่ายขึ้น ก็ลองคิดว่า ทำ SCC ได้ละเปล่า (การรวม node จะทำให้แก้โจทย์ไม่ได้หรือไม่?)
ในข้อนี้ การรวม node ที่สามารถไปหากันได้ทุก node ในนั้น ให้กลายเป็น node เดียว (condensation) ก็ไม่ทำให้โจทย์เปลี่ยนแปลง เพราะค่าของเงินใน ATM ไม่มีติดลบ แปลว่า ถ้าต้องการเดินเก็บให้ได้มากที่สุด ก็ต้องเดินให้หมดในทุก node SCC ที่มี node ที่เราจะไปอยู่แน่นอน (เพราะอย่างไรก็ตาม ใน SCC สามารถไปหากันได้ทุก node จึงสามารถเดินเก็บเงินทั้งหมดได้)
ถึงตรงนี้ใครไม่เข้าใจ งงอะไร โพสต์ถามใน comment ได้เลยนะครับ
มีหลักๆอยู่ 3 algorithms แต่จริงๆไม่ต้องรู้หมด เอาให้เขียนได้ก็พอ algo ที่นิยมกันคือ Kosaraju’s Algorithm และ Tarjan’s SCC Algorithm ในที่นี้จะขอพูดถึง Kosaraju เพราะผมก็ยังไม่เคยใช้ Tarjan’s เลย
รัน DFS ใน graph แล้วจำ finish time ของแต่ละ node ไว้ (finish time คือเวลาที่ออกจากฟังชั่น DFS ของ node นั้นๆ เพื่อไม่ให้งง จะยกตัวอย่าง code ที่ใช้ DFS node และ หาค่า finish time ของแต่ละ node เพื่อให้เป็น idea
int time = 0, top=0; << ตัวแปร global int finishtime[n], visited[n], stack[n]; DFS(node V) { visited[V] = 1; for all node I adjacent node to V if( visited[I] != 1) DFS(I); finishtime[V] = time++; stack[top++] = V; } for all node I ( if (visited[I] != 1) DFS(I);
ทำการ transpose graph คือกลับทิศทาง edge ให้หมด ซึ่งสามารถทำได้ตั้งแต่การรับข้อมูลกราฟ โดยสร้างกราฟไว้อีกอันที่มีทิศทาง edge สลับกับกราฟจริง
ทำ DFS อีกครั้งบน transposed graph แต่ ลำดับ node ที่จะเข้าไปทำ DFS นั้น ให้เริ่มทำตาม finish time จากมากไปน้อย หรือก็คือ ค่อยๆ pop stack ออกมานั่นเอง (เพราะตัวที่เข้าไปท้ายสุดจะมี finish time มากสุด) สมมติให้การ DFS บน transposed graph ใช้ฟังชั่น DFSt
สมมติให้ node ที่ pop ออกมาคือ I, ถ้าเกิด I ยังไม่เคยถูกไปมาก่อน ก็ให้ DFSt I ซะ ทุก node ที่สามารถ DFSt ไปถึงได้จาก I จะอยู่ใน SCC เดียวกับ I
int visited2[n], component[n], componentnumber=1; DFSt(node V) { visited2[V] = 1; component[V] = componentnumber; for all node I adjacent to node V in transposed graph if( visited2[I] != 1) DFSt(I); } while(stack not empty) { now = stack.top(); stack.pop(); if( visited2[now] != 1) DFSt(now); componentnumber++; }
เพียงเท่านี้ เราก็จะได้ SCC ของ graph มาแล้ว โดยค่า component[v] จะบอกว่า node v อยู่ใน component หมายเลขอะไร
ขั้นตอนต่อไปสำหรับการแก้ข้อนี้ คือการสร้าง condensed graph ซึ่งทำได้ไม่ยาก โดยเราจะถือว่า กราฟใหม่มี node เป็นแต่ละ component และถ้าหาก node ใดๆ ใน component A มี edge ไปหา node ใดๆ ใน component B ก็จะมี edge จาก A -> B เพียงเท่านี้ ก็จะได้ condensed graph มาใช้แก้ปัญหาข้อนี้แล้ว
Comments
viagra
Hello! viagra , viagra , viagra , viagra , viagra ,
viagra
Hello! viagra , viagra , buy viagra , viagra , buy cialis ,
viagra
Hello! viagra , viagra , viagra , viagra , viagra online ,
cialis
Hello! cialis , viagra , cheap viagra , viagra , cheap viagra ,
viagra
Hello! viagra , viagra online , cheap viagra , buy cialis , buy cialis ,
cheap viagra
Hello! cheap viagra , cialis , viagra online , viagra , viagra ,
viagra
Hello! viagra , buy viagra , cheap viagra , viagra , cialis ,
viagra
FtartmNd http://utlwtx.com/ gPqKYXnt [url=http://bpfled.com/]gPqKYXnt[/url]
cheap viagra
Hello! cheap viagra ,
viagra online
Hello! viagra online ,
viagra
Hello! viagra ,
cheap viagra
Hello! cheap viagra ,
viagra
Hello! viagra ,
Buy Cialis Online
NKQMDmeH Buy Cialis Online >:]] Cialis >:-OOO Viagra 0747 Cialis 8]]] Viagra 3832 Buy Viagra %-[[[
viagra
Hello! viagra , cialis online , cheap viagra , viagra , cheap cialis ,
viagra online
Hello! viagra online ,
viagra online
Hello! viagra online ,
viagra
Hello! viagra ,
viagra
Hello! viagra ,
viagra
Hello! viagra ,
viagra
Hello! viagra ,
viagra
Hello! viagra ,
viagra
Hello! viagra ,
cialis
Hello! cialis ,
cheap viagra
Hello! cheap viagra ,
viagra
yVhPdw http://sypimt.com/ mkuAhY [url=http://cfryqn.com/]mkuAhY[/url]
viagra
Hello! viagra , cialis online , cialis , viagra , viagra ,
Alife Shoes Mens
Ralph Lauren PolosIf you do and Fitch Clothingnot still ownPolo Solida pair of NikeLacoste Polo RT1 HighWomen Hoodies in your sneakerPolo T-shirtcloset collectionRalph Lauren long sleeve missing a Ralph Lauren Custom-Fithen you areMatch Polotgreat deal ofRalph Lauren Shirtsyour sneaker fashionPolo Shirtswardrobe. WhenPolo Outletsense for yourClassic-Fitthis pair wasWomen Lacostefirst introducedRalph Lauren Shortspopularly and and fitch Shirtsit was seenSuprasMany hip hopSkytop artists haveSupra vaider a strong passionSupras Salefor sneakers.Radii ShoesWest and Drake Kobe Shoes Wale, KanyeLebron James Shoes have all showed Asics Shoes us their best heat.Supra vulk However FatAlife ShoesJoe may be theSupra Shoesbest of the bestcheap supras for saleWe all know Supra TK how much FatCheap Supra Joe loves hisCreative Recreation sneakers. If Air Yeezy.you rememberSkytops Fat JoeHigh Topslicked the bottom
cheap viagra
Hello! cheap viagra , viagra , viagra , cialis , viagra ,
Viagra
pHmgLQU Viagra PgOXd Buy Viagra online 9479 Phentermine online 7367 Buy Viagra online 0601 Buy Cialis 8629 Buy Cialis Online RuUJTN
cheap cialis
Hello! cheap cialis ,
cheap cialis
Hello! cheap cialis ,
viagra
Hello! viagra ,
cialis
Hello! cialis ,
cialis
Hello! cialis ,
Cheap viagra
baHwTSot Cheap viagra 0876 Phentermine 5093 Buy Viagra online gKDlQi Cialis %-[[[ Buy Cialis Online >:]] Cialis 9894
cialis
Hello! cialis ,
cheap cialis
Hello! cheap cialis ,
cheap cialis
Hello! cheap cialis ,
cialis
Hello! cialis ,
cialis
Hello! cialis ,
cialis
Hello! cialis , cialis , cialis , viagra , cheap cialis ,
Buy Cialis Online
XRDSQe Buy Cialis Online %-[[[ Cialis :-O Buy Viagra 6166 Buy Phentermine >:-OOO Buy Viagra >:]] Buy Cialis >:-OOO
cheap cialis
Hello! cheap cialis ,
cialis
Hello! cialis ,
viagra
Hello! viagra ,
cheap cialis
Hello! cheap cialis ,
cheap viagra
Hello! cheap viagra ,
Cheap Cialis
qRIzVOBH Cheap Cialis 6672 Viagra 8843 Buy Viagra =-] Buy Cialis Online %-[[[ Buy Cialis Online sZYoXe Buy Viagra online :-O
buy cialis
Hello! buy cialis ,