Manipulação direta da fila

Eis a versão do código da função distancias que manipula a fila diretamente. Nesse caso, faz mais sentido tratar fila, p e u como variáveis locais:

#define N 100
int dist[N]; // variável global

void distancias (int A[][N], int c) {
   int fila[N], p, u;
   for (int j = 0; j < N; ++j)  dist[j] = N;
   dist[c] = 0;
   p = 0; u = 1; fila[0] = c;    // c entra na fila

   while (p != u) { 
      int i = fila[p++];         // i sai da fila
      for (int j = 0; j < N; ++j)
         if (A[i][j] == 1 && dist[j] >= N) {
            dist[j] = dist[i] + 1;
            fila[u++] = j;       // j entra na fila
         }
   }
}

É instrutivo reescrever o código sem os ++:

#define N 100
int dist[N];

void distancias (int A[][N], int c) {
   int fila[N], p, u;
   for (int j = 0; j < N; j = j+1)  dist[j] = N;
   dist[c] = 0;
   p = 0; u = 1; fila[0] = c;

   while (p != u) { 
      int i = fila[p]; p = p+1;
      for (j = 0; j < N; j = j+1)
         if (A[i][j] == 1 && dist[j] >= N) {
            dist[j] = dist[i] + 1;
            fila[u] = j; u = u+1;
         }
   }
}