// File: 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:
subq $0xe98, %rsp            # imm = 0xE98
movq %rdi, 0xe90(%rsp)
movq 0xe90(%rsp), %rax
movq %rax, 0x70(%rsp)
leaq 0xe78(%rsp), %rdi
movq %rdi, 0x78(%rsp)
callq 0x4db80
movq 0x70(%rsp), %rdi
movq 0x78(%rsp), %rsi
callq 0x414a0
jmp 0x665ef
leaq 0xbc0(%rsp), %rdi
callq 0x41780
jmp 0x665fe
movq 0x70(%rsp), %rsi
leaq 0xbc0(%rsp), %rdi
callq 0x53670
jmp 0x66612
movl $0x0, 0xbbc(%rsp)
movslq 0xbbc(%rsp), %rax
movq %rax, 0x68(%rsp)
leaq 0xe78(%rsp), %rdi
callq 0x47680
movq %rax, %rcx
movq 0x68(%rsp), %rax
cmpq %rcx, %rax
jae 0x666cc
movslq 0xbbc(%rsp), %rsi
leaq 0xe78(%rsp), %rdi
callq 0x4dbc0
movq (%rax), %rax
movq %rax, 0xbb0(%rsp)
movl 0xbb0(%rsp), %esi
movl 0xbb4(%rsp), %edx
leaq 0xbc0(%rsp), %rdi
callq 0x52580
jmp 0x66685
jmp 0x66687
movl 0xbbc(%rsp), %eax
addl $0x1, %eax
movl %eax, 0xbbc(%rsp)
jmp 0x6661d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe70(%rsp)
movl %eax, 0xe6c(%rsp)
jmp 0x66b0a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe70(%rsp)
movl %eax, 0xe6c(%rsp)
jmp 0x66afd
leaq 0xb98(%rsp), %rdi
movq %rdi, 0x60(%rsp)
callq 0x42080
movq 0x60(%rsp), %rsi
leaq 0xbc0(%rsp), %rdi
callq 0x52fa0
jmp 0x666f2
movl $0x0, 0xb94(%rsp)
movslq 0xb94(%rsp), %rax
movq %rax, 0x58(%rsp)
leaq 0xb98(%rsp), %rdi
callq 0x42090
movq %rax, %rcx
movq 0x58(%rsp), %rax
cmpq %rcx, %rax
jae 0x6693d
movslq 0xb94(%rsp), %rsi
leaq 0xb98(%rsp), %rdi
callq 0x420b0
movq %rax, %rdi
callq 0x52790
movq %rax, 0x50(%rsp)
jmp 0x6674c
movq 0x50(%rsp), %rax
cmpq $0x3, %rax
jb 0x66925
leaq 0x628(%rsp), %rdi
callq 0x660a0
jmp 0x6676a
movq 0x70(%rsp), %rdi
addq $0x60, %rdi
callq 0x6e040
movl %eax, 0x930(%rsp)
movslq 0xb94(%rsp), %rsi
leaq 0xb98(%rsp), %rdi
callq 0x420b0
movq %rax, %rsi
leaq 0x688(%rsp), %rdi
callq 0x6e060
jmp 0x667a6
leaq 0x618(%rsp), %rdi
callq 0x3ad90
jmp 0x667b5
leaq 0x688(%rsp), %rdi
callq 0x2d6b0
movq %rdx, 0x40(%rsp)
movq %rax, 0x48(%rsp)
jmp 0x667ce
movq 0x40(%rsp), %rax
movq 0x48(%rsp), %rcx
movq %rcx, 0x608(%rsp)
movq %rax, 0x610(%rsp)
movq 0x608(%rsp), %rax
movq %rax, 0x618(%rsp)
movq 0x610(%rsp), %rax
movq %rax, 0x620(%rsp)
leaq 0x688(%rsp), %rdi
callq 0x2d710
movq %rdx, 0x30(%rsp)
movq %rax, 0x38(%rsp)
jmp 0x66821
movq 0x30(%rsp), %rax
movq 0x38(%rsp), %rcx
movq %rcx, 0x5f8(%rsp)
movq %rax, 0x600(%rsp)
leaq 0x618(%rsp), %rdi
leaq 0x5f8(%rsp), %rsi
callq 0x2d6f0
movb %al, 0x2f(%rsp)
jmp 0x66856
movb 0x2f(%rsp), %al
testb $0x1, %al
jne 0x66863
jmp 0x66900
leaq 0x618(%rsp), %rdi
callq 0x2d750
movq %rax, 0x20(%rsp)
jmp 0x66877
movq 0x70(%rsp), %rdi
movq 0x20(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x5f4(%rsp)
movl 0x930(%rsp), %eax
movl %eax, 0x1c(%rsp)
addq $0x18, %rdi
movl 0x5f4(%rsp), %eax
movl %eax, %esi
callq 0xfbc0
movl 0x1c(%rsp), %ecx
movl %ecx, (%rax)
leaq 0x618(%rsp), %rdi
callq 0x2d760
jmp 0x668bc
jmp 0x66808
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe70(%rsp)
movl %eax, 0xe6c(%rsp)
jmp 0x66af0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe70(%rsp)
movl %eax, 0xe6c(%rsp)
leaq 0x628(%rsp), %rdi
callq 0x5faf0
jmp 0x66af0
movq 0x70(%rsp), %rdi
addq $0x60, %rdi
leaq 0x628(%rsp), %rsi
callq 0x6e1f0
jmp 0x66918
leaq 0x628(%rsp), %rdi
callq 0x5faf0
jmp 0x66927
movl 0xb94(%rsp), %eax
addl $0x1, %eax
movl %eax, 0xb94(%rsp)
jmp 0x666fd
movl $0x0, 0x5f0(%rsp)
movq 0x70(%rsp), %rdi
movl 0x5f0(%rsp), %eax
movq %rax, 0x10(%rsp)
addq $0x18, %rdi
callq 0xfd50
movq %rax, %rcx
movq 0x10(%rsp), %rax
cmpq %rcx, %rax
jae 0x66a5d
movq 0x70(%rsp), %rdi
addq $0x18, %rdi
movl 0x5f0(%rsp), %eax
movl %eax, %esi
callq 0xfbc0
cmpl $0x5f5e100, (%rax)      # imm = 0x5F5E100
jne 0x66a45
leaq 0x88(%rsp), %rdi
callq 0x660a0
jmp 0x669a5
movq 0x70(%rsp), %rdi
addq $0x60, %rdi
callq 0x6e040
movl %eax, 0x390(%rsp)
leaq 0xe8(%rsp), %rdi
movl 0x5f0(%rsp), %esi
callq 0x522c0
jmp 0x669d0
movq 0x70(%rsp), %rdi
movl 0x390(%rsp), %eax
movl %eax, 0xc(%rsp)
addq $0x18, %rdi
movl 0x5f0(%rsp), %eax
movl %eax, %esi
callq 0xfbc0
movl 0xc(%rsp), %ecx
movq 0x70(%rsp), %rdi
movl %ecx, (%rax)
addq $0x60, %rdi
leaq 0x88(%rsp), %rsi
callq 0x6e1f0
jmp 0x66a10
leaq 0x88(%rsp), %rdi
callq 0x5faf0
jmp 0x66a45
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe70(%rsp)
movl %eax, 0xe6c(%rsp)
leaq 0x88(%rsp), %rdi
callq 0x5faf0
jmp 0x66af0
jmp 0x66a47
movl 0x5f0(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x5f0(%rsp)
jmp 0x66948
movq 0x70(%rsp), %rdi
callq 0x66b30
jmp 0x66a69
movl $0x0, 0x84(%rsp)
movq 0x70(%rsp), %rdi
movl 0x84(%rsp), %eax
movq %rax, (%rsp)
addq $0x60, %rdi
callq 0x6e040
movq %rax, %rcx
movq (%rsp), %rax
cmpq %rcx, %rax
jae 0x66ac1
movq 0x70(%rsp), %rdi
movl 0x84(%rsp), %esi
callq 0x66f50
jmp 0x66aac
jmp 0x66aae
movl 0x84(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x84(%rsp)
jmp 0x66a74
leaq 0xb98(%rsp), %rdi
callq 0x421a0
leaq 0xbc0(%rsp), %rdi
callq 0x41f20
leaq 0xe78(%rsp), %rdi
callq 0x4dc40
addq $0xe98, %rsp            # imm = 0xE98
retq
leaq 0xb98(%rsp), %rdi
callq 0x421a0
leaq 0xbc0(%rsp), %rdi
callq 0x41f20
leaq 0xe78(%rsp), %rdi
callq 0x4dc40
movq 0xe70(%rsp), %rdi
callq 0x9cf0
nopw %cs:(%rax,%rax)