//---------------------------------------------------------- bool ParserXML::acessarElemento(unsigned tipo_elem) { bool possui_elem; xmlNode *vet_elems[4]; if(!elem_raiz) throw Excecao(ERR_PARSERS_OPRARVELEMNAOALOC,__PRETTY_FUNCTION__,__FILE__,__LINE__); vet_elems[ELEMENTO_RAIZ]=elem_atual->parent; vet_elems[ELEMENTO_FILHO]=elem_atual->children; vet_elems[ELEMENTO_POSTERIOR]=elem_atual->next; vet_elems[ELEMENTO_ANTERIOR]=elem_atual->prev; /* Verifica se o elemento atual possui o elemento que se deseja acessar. O flag possui_elem também é usado no retorno do método para indicar se o elemento foi movido ou não. */ possui_elem=possuiElemento(tipo_elem); //Caso possua o elemento if(possui_elem) //Move o elemento atual para o elemento escolhido elem_atual=vet_elems[tipo_elem]; return(possui_elem); }
int main() { // Inteiros auxiliares int i, j, x, y, inicial; // Recebe o 'n' inicial scanf("%d", &n); // Recebe o 'm' inicial scanf("%d", &m); // Laço principal while (n != 0 || m != 0) { max = 0; // Reinicia o vetor de estado dos vértices e a lista de adjacencia for (i = 0; i < n; i++) { estado[i] = INEXPLORADO; adjacencia[i] = NULL; } // Recebe o valor de cada vertice for (i = 0; i < n; i++) { scanf("%d", &valor[i]); } // Recebe as 'm' relações entre os vértices for (i = 0; i < m; i++) { scanf("%d", &x); scanf("%d", &y); adjacencia[x] = insereElem(adjacencia[x], y); } // Encontra quais são os vértices que não são dependentes de nenhum outro // A partir desses, chama a recursão para encontrar o maior caminho if (n == 1) { max = valor[0]; } else{ for (i = 0; i < n; i++) { if (estado[i] == INEXPLORADO) { inicial = 1; for (j = 0; j < n; j++) { if (possuiElemento(adjacencia[j], i)) { inicial = 0; break; } } if (inicial) { exploraVertice(adjacencia[i], i); } } } } // Imprime o resultado printf("%d\n", max); for (i = 0; i < n; i++) { libera(adjacencia[i]); } // Recebe um novo 'n' scanf("%d", &n); // Recebe um novo 'm' scanf("%d", &m); } return 0; }