Universidade Federal de Minas Gerais
Instituto de Ciências Exatas
Departamento de Ciência da Computação

Algoritmos e Estruturas de Dados I

 

#include <stdio.h>
#include <stdlib.h>


//https://oeis.org/A006905
//A006905         Number of transitive relations on n labeled nodes.
//1=2, 2=13, 3=171, 4=3994, 5=154303, ...

int isTransitive(int N, int r[][N]){
    int ii,jj,kk;
    for(ii=0; ii<N; ii++)
      for(jj=0; jj<N; jj++)
        for(kk=0; kk<N; kk++)
          if(r[ii][jj]&&r[jj][kk]) if(!r[ii][kk]) return 0;
    return 1;
}

void gera(int N, int mq[][N], int ordem){
  int ii, jj;
  for(ii=0; ii<N; ii++)
    for(jj=0; jj<N; jj++){
      mq[ii][jj]=ordem&1; ordem=ordem>>1;
    }
}

void escreve(int N, int m[][N]){
  int ii, jj;
  for(ii=0; ii<N; ii++){
    for(jj=0; jj<N; jj++) printf(m[ii][jj]?"1 ":"0 ");
    printf("\n");
  }
}

int main(int argc, char *argv[]){
  printf("Entre com numero de elementos:");
  int ne;
  scanf("%d", &ne);
  int r[ne][ne];
  int cntRel;
  int totalRel;
  totalRel=1<<ne*ne;
  int notTrans=0;
  for(cntRel=0; cntRel<totalRel; cntRel++){
    gera(ne, r, cntRel);
    if(!isTransitive(ne, r)){ notTrans++; escreve(ne,r); printf("\n");}
  };
  printf("Das %d relacoes %d sao transitivas (%d nao sao transitivas).\n",
            totalRel,    totalRel-notTrans, notTrans);
  system("PAUSE");     
  return 0;
}