// File: /workspace/github_cpp_makefile_star2_O3/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 0x1518c
leaq 0x5a0(%rsp), %rdi
callq 0x152ae
leaq 0x5a0(%rsp), %rdi
movq %rbx, %rsi
callq 0x1cf40
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x26eee
xorl %r15d, %r15d
leaq 0x5a0(%rsp), %r14
movl (%rax,%r15,8), %esi
movl 0x4(%rax,%r15,8), %edx
movq %r14, %rdi
callq 0x1c416
incq %r15
movq (%rsp), %rax
movq 0x8(%rsp), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r15, %rcx
ja 0x26ec5
xorps %xmm0, %xmm0
leaq 0x20(%rsp), %rsi
movaps %xmm0, (%rsi)
movq $0x0, 0x10(%rsi)
leaq 0x5a0(%rsp), %rdi
callq 0x1c9b4
movq 0x20(%rsp), %rdi
cmpq %rdi, 0x28(%rsp)
je 0x27053
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 0x1c4e0
cmpq $0x3, %rax
jb 0x27032
movq %r13, %rdi
callq 0x26bfc
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 0x2b1ac
movq 0xa0(%rsp), %rdx
movq (%rdx), %rcx
movq %rdx, %rax
testq %rcx, %rcx
jne 0x26fa6
movq %rdx, %rax
movq 0x8(%rax), %rcx
addq $0x8, %rax
testq %rcx, %rcx
je 0x26f99
movq 0xa8(%rsp), %rsi
movq (%rdx,%rsi,8), %rdx
cmpq %rdx, %rcx
je 0x26fe1
movq 0x18(%rbx), %rsi
movl 0x340(%rsp), %edi
movl (%rcx), %r8d
movl %edi, (%rsi,%r8,4)
movq 0x20(%rcx), %rcx
testq %rcx, %rcx
jne 0x26fdc
movq 0x8(%rax), %rcx
addq $0x8, %rax
jmp 0x26fcd
cmpq %rdx, %rcx
jne 0x26fc2
movq %r14, %rdi
movq %r13, %rsi
callq 0x2b29e
leaq 0x570(%rsp), %rdi
callq 0x24558
leaq 0x540(%rsp), %rdi
callq 0x157dc
leaq 0x348(%rsp), %rdi
callq 0x63d2
leaq 0x98(%rsp), %rdi
callq 0x15650
leaq 0x68(%rsp), %rdi
callq 0x24558
movq %r13, %rdi
callq 0x157dc
incq %r12
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rax
subq %rdi, %rax
sarq $0x3, %rax
imulq %r15, %rax
cmpq %r12, %rax
ja 0x26f34
movq 0x18(%rbx), %rax
movq 0x20(%rbx), %rcx
cmpq %rax, %rcx
je 0x2712e
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 0x27118
movq %rbp, %rdi
callq 0x26bfc
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 0x1c28e
movl 0x340(%rsp), %eax
movq 0x18(%rbx), %rcx
movl %eax, (%rcx,%r12,4)
movq %r14, %rdi
movq %rbp, %rsi
callq 0x2b29e
leaq 0x570(%rsp), %rdi
callq 0x24558
leaq 0x540(%rsp), %rdi
callq 0x157dc
leaq 0x348(%rsp), %rdi
callq 0x63d2
movq %r15, %rdi
callq 0x15650
movq %r13, %rdi
callq 0x24558
movq %rbp, %rdi
callq 0x157dc
movq 0x18(%rbx), %rax
movq 0x20(%rbx), %rcx
incl %r12d
movq %rcx, %rdx
subq %rax, %rdx
sarq $0x2, %rdx
cmpq %r12, %rdx
ja 0x2707d
movq %rbx, %rdi
callq 0x27210
movq 0x68(%rbx), %rax
cmpq 0x60(%rbx), %rax
je 0x27170
xorl %r14d, %r14d
movabsq $-0x77dc7c4cf2ae9cdb, %r15 # imm = 0x882383B30D516325
movq %rbx, %rdi
movl %r14d, %esi
callq 0x27400
movq 0x68(%rbx), %rax
subq 0x60(%rbx), %rax
incl %r14d
sarq $0x3, %rax
imulq %r15, %rax
cmpq %r14, %rax
ja 0x2714d
leaq 0x20(%rsp), %rdi
callq 0x15702
leaq 0x5a0(%rsp), %rdi
callq 0x15650
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x2719d
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 0x2720b
jmp 0x271b3
movq %rax, %rbx
jmp 0x271ed
jmp 0x271d3
jmp 0x271d3
jmp 0x271c4
jmp 0x271c4
jmp 0x271d3
jmp 0x271d3
movq %rax, %rbx
leaq 0x38(%rsp), %rdi
callq 0x2b2ce
jmp 0x271d6
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x15702
leaq 0x5a0(%rsp), %rdi
callq 0x15650
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x27203
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x2250
movq %rbx, %rdi
callq 0x23b0
movq %rax, %rbx
jmp 0x271e0