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; }
std::vector<int> get_rc_out_edges() const {return reverseEdges(in_edges_);}