#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
bool arr[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> arr[i][j];
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
// если существует ориентированное ребро, соединяющее вершины i и j
if(arr[i][j]) {
for(int z = 0; z < n; z++) {
// если из вершины j в вершину z ведёт ребро, но из i в z - нет, то граф нетранзитивен
if(arr[j][z] && !arr[i][z]) {
cout << "NO";
return 0;
}
}
}
}
}
cout << "YES";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7CglpbnQgbjsKCWNpbiA+PiBuOwoJYm9vbCBhcnJbbl1bbl07Cglmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJZm9yKGludCBqID0gMDsgaiA8IG47IGorKykgewoJCQljaW4gPj4gYXJyW2ldW2pdOwoJCX0KCX0KCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CgkJCS8vINC10YHQu9C4INGB0YPRidC10YHRgtCy0YPQtdGCINC+0YDQuNC10L3RgtC40YDQvtCy0LDQvdC90L7QtSDRgNC10LHRgNC+LCDRgdC+0LXQtNC40L3Rj9GO0YnQtdC1INCy0LXRgNGI0LjQvdGLIGkg0LggagoJCQlpZihhcnJbaV1bal0pIHsgCgkJCQlmb3IoaW50IHogPSAwOyB6IDwgbjsgeisrKSB7CgkJCQkJLy8g0LXRgdC70Lgg0LjQtyDQstC10YDRiNC40L3RiyBqINCyINCy0LXRgNGI0LjQvdGDIHog0LLQtdC00ZHRgiDRgNC10LHRgNC+LCDQvdC+INC40LcgaSDQsiB6IC0g0L3QtdGCLCDRgtC+INCz0YDQsNGEINC90LXRgtGA0LDQvdC30LjRgtC40LLQtdC9CgkJCQkJaWYoYXJyW2pdW3pdICYmICFhcnJbaV1bel0pIHsgCgkJCQkJCWNvdXQgPDwgIk5PIjsKCQkJCQkJcmV0dXJuIDA7CgkJCQkJfQkKCQkJCX0JCgkJCX0KCQl9Cgl9Cgljb3V0IDw8ICJZRVMiOwoJcmV0dXJuIDA7Cn0=