/* Test2AryTOMatrix.c */
/* testing subprogram Props2Ary */

#include <stdio.h>
#define NN 13       /* 12 = max size for permutations */
int Props2Ary(int*,int*);
void Ary2TOMat(int*,int*,int M[][NN],int);

void main(void)
{
 int
  A[]={1,1,2,2,2,3,4,4,8,10,11,0},     /* Fig 1.2a */
  B[]={2,3,3,4,5,6,5,7,9,0, 0, 0},
  MAT[NN][NN],
 I,J,N;

 N = Props2Ary(A,B);

 Ary2TOMat(A,B,MAT,N);

 puts("");
 for (I=1; I<NN; I++)
  {
   for (J=1; J<NN; J++) printf(" %d  ",MAT[I][J]);
   puts("");
  }

 getchar();
}


 /*******************************************/

 int Props2Ary(int *A, int *B)
 {
  int Npairs,Nlinked,Nisol,Nobj,K,   FLAG[1000];

  Npairs=K=0;
  while (A[K]) {Npairs++; K++;}
  for (K=1; K<=Npairs; K++) FLAG[K]=1;    FLAG[Npairs+1]=0;
  for (K=1; K<=Npairs; K++) if (!B[K]) FLAG[A[K]]=-1;
  Nlinked=Nisol=0;
  for (K=1; K<=Npairs; K++) if (FLAG[K]==1) Nlinked++; else Nisol++;

  Nobj = Nlinked+Nisol;
  printf("%d objects in graph     %d links\n",Nobj,Npairs-Nisol);

  printf("%d linked object(s):   ",Nlinked);
  for (K=1; K<=Npairs; K++) if (FLAG[K]>0) printf("%d ",K); puts("");

  printf("%d isolated object(s):   ",Nisol);
  for (K=1; K<=Npairs; K++) if (FLAG[K]<0) printf("%d ",K); puts("");


  return Npairs;
}

/***************************************************/

void Ary2TOMat(int* P, int* Q, int M[][NN], int N)
{
 int I,J,K;


 for (I=0; I<NN; I++) for (J=0; J<NN; J++) M[I][J] = 0;

 for (K=0; K<N; K++)       /* N=Npairs */
  {I = *P; P++;  J = *Q;  Q++;   M[I][J] = M[J][I] = 1;}

  return;
}  


