/* check a text starting at 0 if it fulfills the regular expression
 * will search for the longest pattern that matches the RE
 * if at any moment we reach the final state, we store it in longestfound
 * but we continue to search so the we find indeed the longest txt
 * if it is successful will return the length of the match
 * if it in UNsucessful will return -1
 */
int check_nfa(const graphtp & g, const char * re, int relen, const char * text, int len, int & counter)
{
    out("check_nfa re='%s' text='%s'\n", re, text);
    int longestfound = -1;
    vi st;
    vi visited(relen+1);

    dfs(g, 0, visited); // get all possible states reachable from start state 0
    get_visited(visited, st);
    print_visited(visited);

    for(int i = 0; i < len && !st.empty(); i++) {
        for(vi::iterator it = st.begin(); it != st.end(); ++it) {
            int s = *it;
            if(s == relen) continue; //need to continue search tho

            if(text[i] == re[s] || re[s] == '.') {
                counter++;
                s = s + 1; //find ne state after it
                dfs(g, s, visited); //find all e-transitions from s
            }
        }

        if(visited.back()) longestfound = i;
        get_visited(visited, st);
        print_visited(visited);
    } 

    out("longestfound='%d'\n", longestfound);
    return longestfound;
}
void main(){
	int i,j;
	for(i = 0;i < n; i++ ){
		for(j = 0;j < n; j++ ){
			if(i == 0 && j == 1){
				conn[i][j] = 1;		
				cost[i][j] = 0;
			}else if(i == 0 && j == 6){
				trconn[i][j] = 1;		
				trcost[i][j] = 0;
			}else if(i == 1 && j == 2){
				conn[i][j] = 1;		
				cost[i][j] = 9;
				trconn[j][i] = 1;		
				trcost[j][i] = 9;
			}else if(i == 1 && j == 3){
				conn[i][j] = 1;
				cost[i][j] = 5;
				trconn[j][i] = 1;		
				trcost[j][i] = 5;	
			}else if(i == 2 && j == 4){
				conn[i][j] = 1;
				cost[i][j] = 2;
				trconn[j][i] = 1;		
				trcost[j][i] = 2;	
			}else if(i == 2 && j == 5){
				conn[i][j] = 1;
				cost[i][j] = 1;
				trconn[j][i] = 1;		
				trcost[j][i] = 1;	
			}else if(i == 2 && j == 7){
				conn[i][j] = 1;
				cost[i][j] = 3;
				trconn[j][i] = 1;		
				trcost[j][i] = 3;	
			}else if(i == 3 && j == 5){
				conn[i][j] = 1;	
				cost[i][j] = 6;
				trconn[j][i] = 1;		
				trcost[j][i] = 6;
			}else if(i == 3 && j == 6){
				conn[i][j] = 1;	
				cost[i][j] = 6;
				trconn[j][i] = 1;		
				trcost[j][i] = 6;
			}else if(i == 4 && j == 5){
				conn[i][j] = 1;	
				cost[i][j] = 2;
				trconn[j][i] = 1;		
				trcost[j][i] = 2;
			}else if(i == 4 && j == 6){
				conn[i][j] = 1;	
				cost[i][j] = 3;
				trconn[j][i] = 1;		
				trcost[j][i] = 3;
			}else if(i == 5 && j == 6){
				conn[i][j] = 1;	
				cost[i][j] = 2;
				trconn[j][i] = 1;		
				trcost[j][i] = 2;
			}else if(i == 7 && j == 6){
				conn[i][j] = 1;	
				cost[i][j] = 2;
				trconn[j][i] = 1;		
				trcost[j][i] = 2;
			}else{
				conn[i][j] = 0;
				cost[i][j] = 0;
				trconn[j][i] = 0;		
				trcost[j][i] = 0;
			}
		}	
	}
	trconn[0][6] = 1;
	printf("trconn[%d][%d] = %d\n",0,6,trconn[0][6]);
	for(i = 0;i < n; i++ ){
		for(j = 0;j < n; j++ ){
			printf("%d  ",conn[i][j]);
		}	
		printf("\n");
	}
	printf("\n");
	for(i = 0;i < n; i++ ){
		for(j = 0;j < n; j++ ){
			printf("%d  ",cost[i][j]);
		}	
		printf("\n");
	}
	printf("\n");
	for(i = 0;i < n; i++ ){
		for(j = 0;j < n; j++ ){
			printf("%d  ",trconn[i][j]);
		}	
		printf("\n");
	}
	printf("\n");
	for(i = 0;i < n; i++ ){
		for(j = 0;j < n; j++ ){
			printf("%d  ",trcost[i][j]);
		}	
		printf("\n");
	}
	printf("\n");
	route[0] = 1;
	r++;	
	prepare_generic_func(0,0);
	Uniform_cost_search(1,1);
	print_visited();
	printf("Optimum Path : ");
	printpath(p,0);
	printcost(p,0);
	printf("\n\n");
}