สมมติว่าเรามีสองอาร์เรย์ A และ B ทั้งคู่มีองค์ประกอบ N แต่ละตัว พิจารณา Amal และ Bimal กำลังเล่นเกมบนกระดานที่มีหมายเลขเซลล์ตั้งแต่ 1 ถึง N และถนน N-1 ถนนเชื่อมต่อสองเซลล์ ดังนั้นถนนจึงเชื่อม A[i] กับ B[i] ทุกเซลล์สามารถเข้าถึงได้จากทุกเซลล์โดยการเดินทางซ้ำๆ ไปยังเซลล์ที่อยู่ติดกัน เริ่มแรก เซลล์ 1 จะถูกทำเครื่องหมายเป็นสีดำ และเซลล์ N เป็นสีขาว เซลล์อื่นไม่มีสี Amal เล่นก่อน และพวกเขากำลังเล่นอีกทางหนึ่ง Amal เลือกเซลล์ที่ไม่มีสีซึ่งอยู่ติดกับเซลล์สีดำและทาสีดำ Bimal เลือกเซลล์ที่ไม่มีสีซึ่งอยู่ติดกับเซลล์สีขาวและทาสีขาว เมื่อผู้เล่นไม่สามารถทาสีเซลล์ได้ เขาจะแพ้ เราต้องหาผู้ชนะให้ได้
ดังนั้น ถ้าอินพุตเป็น A =[3, 1, 3, 7, 5, 1]; B =[6, 2, 1, 4, 7, 4] ผลลัพธ์จะเป็น Amal เพราะถ้า Amal ลงสีเซลล์ 2 เป็นสีดำก่อน เขาจะชนะโดยไม่คำนึงถึงการเคลื่อนไหวของ Bimal
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
N :=99999Define one adjacency list adjListDefine three large arrays p, d, and sszDefine a function dfs() ซึ่งจะใช้เวลา nd, par, dep, p[nd] :=par d[nd] :=dep ssz [nd] :=1 สำหรับแต่ละโหนด i ใน adjList[nd] ทำถ้า i XOR par ไม่ใช่ศูนย์ แล้ว:dfs(i, nd, dep + 1) ssz[nd] :=ssz[nd] + ssz [i]จากวิธีหลัก ให้ทำดังนี้:n :=size of Afor initialize i :=1, when i=n จากนั้น "Bimal" มิฉะนั้น "Amal"ก่อน> ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;int N =99999;vector > adjList(N);vector p(N), d(N), ssz(N) );void dfs(int nd, int par, int dep){ p[nd] =ตราไว้หุ้นละ; d[nd] =เดป; ssz[nd] =1; สำหรับ (int i:adjList[nd]){ if (i ^ par){ dfs(i, nd, dep + 1); ssz[nd] +=ssz[i]; } }}การแก้สตริง (เวกเตอร์ A, เวกเตอร์ B){ int n =A.size(); สำหรับ (int i =1; i =n ? "Bimal" :"Amal");}int main(){ vector A ={ 3, 1, 3, 7, 5, 1 }; เวกเตอร์ B ={ 6, 2, 1, 4, 7, 4 }; ศาล <<แก้ (A, B) < อินพุต
{ 3, 1, 3, 7, 5, 1 }, { 6, 2, 1, 4, 7, 4 }ผลลัพธ์
อามาล