// File: Kei18[P]pibt/./src/solver/pps.cpp
// Function: PPS::CLOSEST_EMPTY_VERTICLES(Agent*)
Nodes PPS::CLOSEST_EMPTY_VERTICLES(Agent* c) {
  Nodes empties;
  Nodes occupied;
  Nodes Y;
  Nodes C;

  // create occupied lists
  for (auto a : A) occupied.push_back(a->getNode());
  std::unordered_map<int, VD*> table;
  VD* n = new VD { c->getNode(), 0 };
  int id = n->v->getId();
  int d;

  std::unordered_set<int> OPEN = { id };
  table.emplace(id, n);

  while (!OPEN.empty()) {
    auto itr = std::min_element(OPEN.begin(), OPEN.end(),
                                [&table] (int a, int b)
                                { return table.at(a)->d < table.at(b)->d; });
    id = *itr;
    n = table.at(id);

    // check empty or not
    if (!inArray(n->v, occupied)) {
      if (Y.empty()) {
        d = n->d;
      } else if (d < n->d) {
        break;
      }
      // same distance
      Y.push_back(n->v);
    }

    // update list
    OPEN.erase(itr);

    C = G->neighbor(n->v);
    for (auto m : C) {
      id = m->getId();
      auto itr = table.find(id);
      if (itr == table.end()) {
        VD* l = new VD { m, n->d + 1 };
        table.emplace(id, l);
        OPEN.insert(id);
        continue;
      }
    }
  }

  return Y;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x2b0, %rsp            # imm = 0x2B0
movq %rdi, -0x1f8(%rbp)
movq %rdi, %rax
movq %rax, -0x200(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x1f0(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x3e880
leaq -0x48(%rbp), %rdi
callq 0x3e880
movq -0x1f8(%rbp), %rdi
movb $0x0, -0x49(%rbp)
callq 0x3e880
leaq -0x68(%rbp), %rdi
callq 0x3e880
movq -0x1f0(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rdi
callq 0x39b60
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rdi
callq 0x399f0
movq %rax, -0x80(%rbp)
leaq -0x78(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x51bd0
testb $0x1, %al
jne 0x9068a
jmp 0x906f6
leaq -0x78(%rbp), %rdi
callq 0x51c10
movq (%rax), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rdi
callq 0x51cb0
movq %rax, -0x208(%rbp)
jmp 0x906b2
movq -0x208(%rbp), %rax
movq %rax, -0x90(%rbp)
leaq -0x48(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x4c210
jmp 0x906d2
jmp 0x906d4
leaq -0x78(%rbp), %rdi
callq 0x51c30
jmp 0x90677
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
jmp 0x90c6d
leaq -0xd8(%rbp), %rdi
callq 0x97190
movl $0x10, %edi
callq 0x84e0
movq %rax, -0x210(%rbp)
jmp 0x90715
movq -0x210(%rbp), %rax
movq %rax, -0x220(%rbp)
movq -0x18(%rbp), %rdi
callq 0x51cb0
movq %rax, -0x218(%rbp)
jmp 0x90735
movq -0x210(%rbp), %rax
movq -0x220(%rbp), %rcx
movq -0x218(%rbp), %rdx
movq %rdx, (%rcx)
movl $0x0, 0x8(%rax)
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
movq (%rax), %rdi
callq 0x3ae00
movl %eax, -0x224(%rbp)
jmp 0x90772
movl -0x224(%rbp), %eax
movl %eax, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
movl %eax, -0x134(%rbp)
leaq -0x134(%rbp), %rax
movq %rax, -0x130(%rbp)
movq $0x1, -0x128(%rbp)
leaq -0x137(%rbp), %rdi
movq %rdi, -0x230(%rbp)
callq 0x4e8c0
movq -0x230(%rbp), %rcx
movq -0x130(%rbp), %rsi
movq -0x128(%rbp), %rdx
movq %rsp, %rax
movq %rcx, (%rax)
xorl %eax, %eax
movl %eax, %ecx
leaq -0x120(%rbp), %rdi
leaq -0x135(%rbp), %r8
leaq -0x136(%rbp), %r9
callq 0x971b0
jmp 0x907f1
leaq -0x137(%rbp), %rdi
callq 0x4e9c0
leaq -0xd8(%rbp), %rdi
leaq -0xe4(%rbp), %rsi
leaq -0xe0(%rbp), %rdx
callq 0x97210
movb %dl, -0x239(%rbp)
movq %rax, -0x238(%rbp)
jmp 0x90826
movb -0x239(%rbp), %al
movq -0x238(%rbp), %rcx
movq %rcx, -0x148(%rbp)
movb %al, -0x140(%rbp)
leaq -0x120(%rbp), %rdi
callq 0x742c0
xorb $-0x1, %al
testb $0x1, %al
jne 0x90857
jmp 0x90c34
leaq -0x120(%rbp), %rdi
movq %rdi, -0x250(%rbp)
callq 0x74290
movq -0x250(%rbp), %rdi
movq %rax, -0x158(%rbp)
callq 0x3f2c0
movq %rax, -0x160(%rbp)
leaq -0xd8(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x158(%rbp), %rdi
movq -0x160(%rbp), %rsi
movq -0x168(%rbp), %rdx
callq 0x93e20
movq %rax, -0x248(%rbp)
jmp 0x908b5
movq -0x248(%rbp), %rax
movq %rax, -0x150(%rbp)
leaq -0x150(%rbp), %rdi
callq 0x742e0
movl (%rax), %eax
movl %eax, -0xe4(%rbp)
leaq -0xd8(%rbp), %rdi
leaq -0xe4(%rbp), %rsi
callq 0x97260
movq %rax, -0x258(%rbp)
jmp 0x908f3
movq -0x258(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
movq (%rax), %rdi
leaq -0x48(%rbp), %rsi
callq 0x91410
movb %al, -0x259(%rbp)
jmp 0x9091f
movb -0x259(%rbp), %al
testb $0x1, %al
jne 0x90a0e
jmp 0x9092f
movq -0x1f8(%rbp), %rdi
callq 0x3ec00
testb $0x1, %al
jne 0x90944
jmp 0x909de
movq -0xe0(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0xe8(%rbp)
jmp 0x909f7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
jmp 0x90c61
movq -0x210(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
movl $0x10, %esi
callq 0x84f0
jmp 0x90c61
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
leaq -0x137(%rbp), %rdi
callq 0x4e9c0
jmp 0x90c61
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
leaq -0x120(%rbp), %rdi
callq 0x3f540
jmp 0x90c61
movl -0xe8(%rbp), %eax
movq -0xe0(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jge 0x909f5
jmp 0x90c34
jmp 0x909f7
movq -0x1f8(%rbp), %rdi
movq -0xe0(%rbp), %rsi
callq 0x3f490
jmp 0x90a0c
jmp 0x90a0e
movq -0x150(%rbp), %rax
movq %rax, -0x170(%rbp)
movq -0x170(%rbp), %rsi
leaq -0x120(%rbp), %rdi
callq 0x743b0
movq %rax, -0x268(%rbp)
jmp 0x90a38
movq -0x1f0(%rbp), %rax
movq -0x268(%rbp), %rcx
movq %rcx, -0x178(%rbp)
movq 0x38(%rax), %rsi
movq -0xe0(%rbp), %rax
movq (%rax), %rdx
leaq -0x190(%rbp), %rdi
callq 0x3c8d0
jmp 0x90a69
leaq -0x68(%rbp), %rdi
leaq -0x190(%rbp), %rsi
callq 0x3f230
leaq -0x190(%rbp), %rdi
callq 0xd7d0
leaq -0x68(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x198(%rbp), %rdi
callq 0x3b730
movq %rax, -0x1a0(%rbp)
movq -0x198(%rbp), %rdi
callq 0x3b760
movq %rax, -0x1a8(%rbp)
leaq -0x1a0(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0x3b790
testb $0x1, %al
jne 0x90ad2
jmp 0x90c2f
leaq -0x1a0(%rbp), %rdi
callq 0x3bb00
movq (%rax), %rax
movq %rax, -0x1b0(%rbp)
movq -0x1b0(%rbp), %rdi
callq 0x3ae00
movl %eax, -0x26c(%rbp)
jmp 0x90afc
movl -0x26c(%rbp), %eax
movl %eax, -0xe4(%rbp)
leaq -0xd8(%rbp), %rdi
leaq -0xe4(%rbp), %rsi
callq 0x97290
movq %rax, -0x278(%rbp)
jmp 0x90b24
movq -0x278(%rbp), %rax
movq %rax, -0x1b8(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x972f0
movq %rax, -0x1c0(%rbp)
leaq -0x1b8(%rbp), %rdi
leaq -0x1c0(%rbp), %rsi
callq 0x972c0
testb $0x1, %al
jne 0x90b61
jmp 0x90c1c
movl $0x10, %edi
callq 0x84e0
movq %rax, -0x280(%rbp)
jmp 0x90b74
movq -0x280(%rbp), %rax
movq -0x1b0(%rbp), %rcx
movq %rcx, (%rax)
movq -0xe0(%rbp), %rcx
movl 0x8(%rcx), %ecx
incl %ecx
movl %ecx, 0x8(%rax)
movq %rax, -0x1c8(%rbp)
leaq -0xd8(%rbp), %rdi
leaq -0xe4(%rbp), %rsi
leaq -0x1c8(%rbp), %rdx
callq 0x97210
movb %dl, -0x289(%rbp)
movq %rax, -0x288(%rbp)
jmp 0x90bc4
movb -0x289(%rbp), %al
movq -0x288(%rbp), %rcx
movq %rcx, -0x1d8(%rbp)
movb %al, -0x1d0(%rbp)
leaq -0x120(%rbp), %rdi
leaq -0xe4(%rbp), %rsi
callq 0x74250
movb %dl, -0x299(%rbp)
movq %rax, -0x298(%rbp)
jmp 0x90c00
movb -0x299(%rbp), %al
movq -0x298(%rbp), %rcx
movq %rcx, -0x1e8(%rbp)
movb %al, -0x1e0(%rbp)
jmp 0x90c1e
jmp 0x90c1e
leaq -0x1a0(%rbp), %rdi
callq 0x3bad0
jmp 0x90ab6
jmp 0x90840
movb $0x1, -0x49(%rbp)
leaq -0x120(%rbp), %rdi
callq 0x3f540
leaq -0xd8(%rbp), %rdi
callq 0x97320
leaq -0x68(%rbp), %rdi
callq 0xd7d0
testb $0x1, -0x49(%rbp)
jne 0x90ca2
jmp 0x90c96
leaq -0xd8(%rbp), %rdi
callq 0x97320
leaq -0x68(%rbp), %rdi
callq 0xd7d0
movq -0x1f8(%rbp), %rdi
callq 0xd7d0
leaq -0x48(%rbp), %rdi
callq 0xd7d0
leaq -0x30(%rbp), %rdi
callq 0xd7d0
jmp 0x90cc4
movq -0x1f8(%rbp), %rdi
callq 0xd7d0
leaq -0x48(%rbp), %rdi
callq 0xd7d0
leaq -0x30(%rbp), %rdi
callq 0xd7d0
movq -0x200(%rbp), %rax
addq $0x2b0, %rsp            # imm = 0x2B0
popq %rbp
retq
movq -0x98(%rbp), %rdi
callq 0x8880