terça-feira, 31 de maio de 2011

Implementações comentadas! Ir e Vir!

#include <stdio.h>
#include <stdlib.h>
//Estruturas para a criação de filas
struct sNo
{
    int valor;
    struct sNo *prox;
};
typedef struct sNo Tno;
struct sFila
{
    Tno *H,*T;
};
//Função para inserir valor na fila
inserir(struct sFila *L,int V)
{
    Tno *P;
    P=(Tno*)malloc(sizeof(Tno));
    if(!P)
        printf("Erro de memoria!\n");
    else
    {
        P->valor=V;
        P->prox= NULL;
        if(!(L->H)&&!(L->T))
        {
            L->H=P;
            L->T=P;
        }
        else
        {
            L->T->prox=P;
            L->T=P;
        }
    }
}
//Função para remover um valor de uma fila
remover(struct sFila *L)
{
    Tno *P;
    P=L->H;
    L->H=L->H->prox;
    if(L->H==NULL)
        L->T=NULL;
    free(P);
}
//Zerar a matriz
void matriz_nula(int **matriz,int tamanho)
{
    int i,j;
    for(i=0; i<tamanho; i++)
        for(j=0; j<tamanho; j++)
            matriz[i][j]=0;
}
int main(void)
{
    //Declaração de duas filas. Sendo G para mostrar o resultado final
    struct sFila G,fila;
    fila.H=NULL;
    fila.T=NULL;
    G.H=NULL;
    G.T=NULL;
    Tno *Pont;
    int N,M,v,w,p,**matriz,**matriz2,ind,acm,i,j;
    system("color f0");
    for(;;)
    {
        scanf("%d %d",&N,&M);
        matriz=(int **)calloc(N,sizeof(int*));
        for(i=0; i<N; i++)
            matriz[i] = (int*) calloc (N, sizeof(int));
        matriz_nula(matriz,N);
        if(N==0&&M==0)
            break;
        //Estrutura que recebe os pontos de interseção, rua e tipo de rua
        //Insere a conectividade das interseções na matriz
        while(M--)
        {
            scanf("%d %d %d",&v,&w,&p);
            if(p == 1)
                matriz[v-1][w-1] = 1;
            else
            {
                matriz[v-1][w-1] = 1;
                matriz[w-1][v-1] = 1;
            }
        }
        //Estrutura para verificar se conexão é satisfeita
        for(i=0; i<N; i++)
        {
            matriz2=(int **)calloc(N,sizeof(int*));
            for(j=0; j<N; j++)
                matriz2[j] = (int*) calloc (N, sizeof(int));
            matriz_nula(matriz2,N);
            //Estrutura para determinar qual linha será verificada as interseções
            for(j=0; j<N; j++)
            {
                if(matriz[i][j]&&!matriz2[i][j]&i!=j)
                {
                    inserir(&fila,j);
                    matriz2[i][j]=1;
                }
            }
            //Estrutura inserir valor 1 na matriz caso as interseções estejam ligadas
            while(!((fila.H==NULL)&&(fila.T==NULL)))
            {
                ind=fila.H->valor;
                matriz[i][ind]=1;
                for(j=0; j<N; j++)
                {
                    if(matriz[ind][j]&&!matriz2[ind][j]&&ind!=j)
                    {
                        inserir(&fila,j);
                        matriz2[ind][j]=1;
                    }
                }
                remover(&fila);
            }
        }

        acm=0;
        for(i=0; i<N; i++)
            for(j=0; j<N; j++)
                acm+=matriz[i][j];
        if(acm == N*N)
            inserir(&G,1);
        else
            inserir(&G,0);
        for(i=0; i<N; i++)
        {
            free(matriz[i]);
            free(matriz2[i]);
        }
        free(matriz);
        free(matriz2);
    }
    Pont=G.H;
    //Saída
    while(G.H!=NULL)
    {
        printf("%d\n",G.H->valor);
        remover(&G);
    }
    return 0;
}

Nenhum comentário:

Postar um comentário