Exemplo n.º 1
0
void examina(int32_t *grafo, int numVertices, unsigned int *potencias2, int linha, char *vertices, int32_t *visitado) {
    int tamVertices = strlen(vertices);
    vertices[tamVertices]     = (char)(97 + linha);
    vertices[tamVertices + 1] = '\0';

    int i;
    for(i = linha + 1; i < numVertices; i++) {
        if(grafo[linha] & potencias2[i] && !(*visitado & potencias2[i])) {
            *visitado |= potencias2[i];
            examina(grafo, numVertices, potencias2, i, vertices, visitado);
        }
    }

    for(i = 0; i < linha; i++) {
        if(grafo[i] & potencias2[linha] && !(*visitado & potencias2[i])) {
            *visitado |= potencias2[i];
            examina(grafo, numVertices, potencias2, i, vertices, visitado);
        }
    }
}
Exemplo n.º 2
0
/* Copia: */
void copia(PCola destino,PCola origen){ 
	PNodoCola temp;
	if (tamano(origen)==0) /* Origen no debe estar vacio*/
		return;
	while((tamano(destino))>0) /* Borrado de la cola destino */
	{
		extrae(destino);
	}
	temp = origen->iterador; /* Almaceno temporalmente el iterador */
	inicio(origen);
	inserta(destino,examina(origen));
	while (avanza(origen)) /* Recorro la cola origen,y la voy insertando */
	{
		inserta(destino,examina(origen));
		/* Si he llegado al elemento que estaba señalado,fijo el iterador
		 * en el final de destino */
		if (origen->iterador==temp) 
			fin(destino);
	}
	origen->iterador=temp; /* Recolocar el iterador en origen */

}
Exemplo n.º 3
0
int main() {

    unsigned int potencias2[26];
    int i, j, k;
    for(i = 0; i < 26; i++) {
        potencias2[i]= pow(2, i);
    }

    int N;
    scanf("%d", &N);

    int atual = 1;
    while(atual <= N) {

        printf("Case #%d:\n", atual);

        int V, E;
        scanf("%d %d", &V, &E);

        int32_t grafo[26];
        for(i = 0; i < V; i++) {
            grafo[i] = 0;
        }

        char origem, destino;
        int numOrigem, numDestino;
        while(E) {
            scanf(" %c %c", &origem, &destino);
            numOrigem = origem % 97;
            numDestino = destino % 97;
            if(numOrigem > numDestino) {
                numOrigem  ^= numDestino;
                numDestino ^= numOrigem;
                numOrigem  ^= numDestino;
            }

            grafo[numOrigem] |= potencias2[numDestino];

            E--;
        }

        int numGrupos = 0;
        char vertices[27];
        int32_t visitado = 0;
        for(i = 0; i < V; i++) {
            vertices[0] = '\0';
            if(grafo[i] && !(visitado & potencias2[i])) {
                visitado |= potencias2[i];
                vertices[0] = (char)(97 + i);
                vertices[1] = '\0';
                for(j = i + 1; j < V; j++) {
                    if((grafo[i] & potencias2[j]) && !(visitado & potencias2[j]) ) {
                        visitado |= potencias2[j];
                        examina(grafo, V, potencias2, j, vertices, &visitado);
                    }
                }

                qsort((void*)vertices, strlen(vertices), sizeof(char), compara);

                for(j = 0; j < strlen(vertices); j++) printf("%c,", vertices[j]);
                printf("\n");

                numGrupos++;
            } else if(!(visitado & potencias2[i])) {
                printf("%c,\n", (char)(97 + i));
                visitado |= potencias2[i];
                numGrupos++;
            }
        }

        printf("%d connected components\n\n", numGrupos);

        atual++;
    }

    return 0;
}