// File: /workspace/github_cpp_makefile_star2_O1/fjamour[P]icentral/src/qube.cc
// Function: graph_t::find_mucs_fast()
void graph_t::find_mucs_fast()
{
    //1. find bridges
    //2. delete bridges
    //3. find connected components of size >=3 (these are MUCs)
    vector<edge_t> bridge_vec;
    find_bridge_edges(bridge_vec);
    graph_hash_t gh;
//    printf("DBG filling graph hash...\n");
    gh.fill_graph(*this);
//    printf("DBG removing bridges...\n");
    for(int i = 0; i < bridge_vec.size(); ++i) {
        edge_t e = bridge_vec[i];
        gh.remove_edge(e.first, e.second);
    }
    vector<graph_hash_t> conn_comp_vec;
//    printf("DBG finding connected components...\n");
    gh.find_conn_comp(conn_comp_vec);
//    printf("DBG constructing MUCs...\n");
    for(int i = 0; i < conn_comp_vec.size(); ++i) {
        if(conn_comp_vec[i].size() >= 3) {
            muc_t muc;
            muc.id = muc_vec.size();
            muc.muc_subgraph = conn_comp_vec[i];
            graph_hash_t::nodes_map_t::iterator it;
            it = muc.muc_subgraph.nodes_map.begin();
            for(; it != muc.muc_subgraph.nodes_map.end(); ++it) {
                node_id_t v = it->first;
                node_to_muc_vec[v] = muc.id;
            }
            muc_vec.push_back(muc);
        }
    }
//    printf("DBG constructing single node MUCs...\n");
    //print_mucs();
    //create single vertex muc's
    for(node_id_t i = 0; i < node_to_muc_vec.size(); ++i) {
        if(node_to_muc_vec[i] == INF) {
            muc_t muc;
            muc.id = muc_vec.size();
            muc.muc_subgraph.insert_node(i);
            node_to_muc_vec[i] = muc.id;
            muc_vec.push_back(muc);
        }
    }
//    printf("DBG finding connection vertices...\n");
    find_conn_verts();
    
    //find the disconnected subgraphs that will result from the deletion of
    //connection vertices
//    printf("DBG finding MUC subgraphs...\n");
    for(muc_id_t m = 0; m < muc_vec.size(); ++m) {
        find_muc_subgraphs(m);
    }
//    printf("DBG DONE!...\n");
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x848, %rsp            # imm = 0x848
movq %rdi, %rbx
xorps %xmm0, %xmm0
movq %rsp, %rsi
movaps %xmm0, (%rsi)
movq $0x0, 0x10(%rsi)
callq 0x1527e
leaq 0x5a0(%rsp), %rdi
callq 0x153ae
leaq 0x5a0(%rsp), %rdi
movq %rbx, %rsi
callq 0x1d062
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x27138
xorl %r15d, %r15d
leaq 0x5a0(%rsp), %r14
movl (%rax,%r15,8), %esi
movl 0x4(%rax,%r15,8), %edx
movq %r14, %rdi
callq 0x1c538
incq %r15
movq (%rsp), %rax
movq 0x8(%rsp), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r15, %rcx
ja 0x2710f
xorps %xmm0, %xmm0
leaq 0x20(%rsp), %rsi
movaps %xmm0, (%rsi)
movq $0x0, 0x10(%rsi)
leaq 0x5a0(%rsp), %rdi
callq 0x1cae8
movq 0x20(%rsp), %rdi
cmpq %rdi, 0x28(%rsp)
je 0x2729d
leaq 0x60(%rbx), %r14
xorl %r12d, %r12d
leaq 0x38(%rsp), %r13
movabsq $-0x303030303030303, %r15 # imm = 0xFCFCFCFCFCFCFCFD
imulq $0x2a8, %r12, %rbp      # imm = 0x2A8
addq %rbp, %rdi
callq 0x1c62c
cmpq $0x3, %rax
jb 0x2727c
movq %r13, %rdi
callq 0x26e2c
movq 0x68(%rbx), %rax
subq 0x60(%rbx), %rax
shrq $0x3, %rax
imull $0xd516325, %eax, %eax  # imm = 0xD516325
movl %eax, 0x340(%rsp)
addq 0x20(%rsp), %rbp
leaq 0x98(%rsp), %rdi
movq %rbp, %rsi
callq 0x2b542
movq 0xa0(%rsp), %rdx
movq (%rdx), %rcx
movq %rdx, %rax
testq %rcx, %rcx
jne 0x271f0
movq %rdx, %rax
movq 0x8(%rax), %rcx
addq $0x8, %rax
testq %rcx, %rcx
je 0x271e3
movq 0xa8(%rsp), %rsi
movq (%rdx,%rsi,8), %rdx
cmpq %rdx, %rcx
je 0x2722b
movq 0x18(%rbx), %rsi
movl (%rcx), %edi
movl 0x340(%rsp), %r8d
movl %r8d, (%rsi,%rdi,4)
movq 0x20(%rcx), %rcx
testq %rcx, %rcx
jne 0x27226
movq 0x8(%rax), %rcx
addq $0x8, %rax
jmp 0x27217
cmpq %rdx, %rcx
jne 0x27205
movq %r14, %rdi
movq %r13, %rsi
callq 0x2b634
leaq 0x570(%rsp), %rdi
callq 0x246f6
leaq 0x540(%rsp), %rdi
callq 0x158ce
leaq 0x348(%rsp), %rdi
callq 0x6460
leaq 0x98(%rsp), %rdi
callq 0x15750
leaq 0x68(%rsp), %rdi
callq 0x246f6
movq %r13, %rdi
callq 0x158ce
incq %r12
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rax
subq %rdi, %rax
sarq $0x3, %rax
imulq %r15, %rax
cmpq %r12, %rax
ja 0x2717e
movq 0x18(%rbx), %rax
cmpq %rax, 0x20(%rbx)
je 0x27372
leaq 0x60(%rbx), %r14
leaq 0x98(%rsp), %r15
xorl %r12d, %r12d
leaq 0x68(%rsp), %r13
leaq 0x38(%rsp), %rbp
cmpl $0x5f5e100, (%rax,%r12,4) # imm = 0x5F5E100
jne 0x27357
movq %rbp, %rdi
callq 0x26e2c
movq 0x68(%rbx), %rax
subq 0x60(%rbx), %rax
shrq $0x3, %rax
imull $0xd516325, %eax, %eax  # imm = 0xD516325
movl %eax, 0x340(%rsp)
movq %r15, %rdi
movl %r12d, %esi
callq 0x1c396
movl 0x340(%rsp), %eax
movq 0x18(%rbx), %rcx
movl %eax, (%rcx,%r12,4)
movq %r14, %rdi
movq %rbp, %rsi
callq 0x2b634
leaq 0x570(%rsp), %rdi
callq 0x246f6
leaq 0x540(%rsp), %rdi
callq 0x158ce
leaq 0x348(%rsp), %rdi
callq 0x6460
movq %r15, %rdi
callq 0x15750
movq %r13, %rdi
callq 0x246f6
movq %rbp, %rdi
callq 0x158ce
incl %r12d
movq 0x18(%rbx), %rax
movq 0x20(%rbx), %rcx
subq %rax, %rcx
sarq $0x2, %rcx
cmpq %r12, %rcx
ja 0x272c4
movq %rbx, %rdi
callq 0x27454
movq 0x68(%rbx), %rax
cmpq 0x60(%rbx), %rax
je 0x273b4
xorl %r14d, %r14d
movabsq $-0x77dc7c4cf2ae9cdb, %r15 # imm = 0x882383B30D516325
movq %rbx, %rdi
movl %r14d, %esi
callq 0x27642
movq 0x68(%rbx), %rax
subq 0x60(%rbx), %rax
incl %r14d
sarq $0x3, %rax
imulq %r15, %rax
cmpq %r14, %rax
ja 0x27391
leaq 0x20(%rsp), %rdi
callq 0x15802
leaq 0x5a0(%rsp), %rdi
callq 0x15750
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x273e1
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x2250
addq $0x848, %rsp            # imm = 0x848
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x2744f
jmp 0x273f7
movq %rax, %rbx
jmp 0x27431
jmp 0x27417
jmp 0x27417
jmp 0x27408
jmp 0x27408
jmp 0x27417
jmp 0x27417
movq %rax, %rbx
leaq 0x38(%rsp), %rdi
callq 0x2b664
jmp 0x2741a
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x15802
leaq 0x5a0(%rsp), %rdi
callq 0x15750
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x27447
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x2250
movq %rbx, %rdi
callq 0x23b0
movq %rax, %rbx
jmp 0x27424