Esempio n. 1
0
bool isLengthFiniteTarjan(DFA *M, int var, int *indices)
{
    if (check_emptiness_minimized(M) || checkOnlyEmptyString(M, var, indices)) {
        return true;
    }

    int node;
    int SCCcount=0;
    bool sccFound = false;
    
    // we need sink just for printing
    int sink = find_sink(M);
    assert(sink >= 0);
    
    // convert dfa->graph, if there is any self cycle, stop and return
    if (dfa_to_graph(M)){
        return false;
    }

    
    vertexStatus=(int*) malloc(numOfNodes*sizeof(int));
    secondDFSrestarts=(int*) malloc(numOfNodes*sizeof(int));
    if (!vertexStatus || !secondDFSrestarts)
    {
        printf("malloc failedn");
        exit(0);
    }
    // DFS code
    for (node=0;node<numOfNodes;node++)
        vertexStatus[node]=WHITE;
    finishIndex=numOfNodes;
    for (node=0;node<numOfNodes;node++)
        if (vertexStatus[node]==WHITE)
            DFSvisit(node);
    
    reverseEdges();
    
    // DFS code
    for (node=0;node<numOfNodes;node++)
        vertexStatus[node]=WHITE;
    for (node=0;node<numOfNodes;node++)
        if (vertexStatus[secondDFSrestarts[node]]==WHITE)
        {
            SCCcount++;
//            printf("Strongly Connected Component %d\n",SCCcount);
            if(DFSvisit2(secondDFSrestarts[node], sink) == true){
//                printf("Found a real SCC on node %d\n", node);
                sccFound = true;
            }
            
        }
    
    free(edgeTab);
    free(firstEdge);
    free(vertexStatus);
    free(secondDFSrestarts);
    return !sccFound;
}
Esempio n. 2
0
 std::vector<int> get_rc_out_edges() const {return reverseEdges(in_edges_);}