Non è chiara la logica di quel codice. Innanzitutto i e j vengono inizializzate a valori random così com'è scritto. Per cui quel while può andare in tutti i modi possibili e in maniera casuale.

Poi il while come ciclo di controllo non controlla un granchè, visto che i due for comunque completano i rispettivi cicli, al termine dei quali i e j avranno sempre gli stessi valori. Cioè i sarà pari a N-1 e j a N.

Inoltre, trattandosi di una matrice quadrata, la soluzione è semplicissima. Ovvero devi considerare tutti e soli gli elementi che hanno gli stessi valori della riga e della colonna.

Cioè

codice:
for (i=0; i<N; i++)
    if (max < mat[i][i]) max = mat[i][i];
Tutto qui.

Se la matrice fosse stata rettangolare ( MxN ), quel i<N sarebbe diventato i < minimo tra N e M.