#include #include using namespace std; void solve() { int n; cin >> n; // считываем кол-во вершин в графе vector> G(n, vector(n)); // G[i][j] = true, если в графе есть ребро i -> j for (int i = 0; i < n; ++i) { // Итерируемся по строкам матрицы смежности for (int j = 0; j < n; ++j) { // Итерируемся по столбцам int x; cin >> x; // считываем значение на пересечении i-ой строки и j-го столбца G[i][j] = x; // В C++ за true считается любое число отличное от нуля, потому x неявным образом приведётся к true, если x == 1, и к false - если нет } } for (int u = 0; u < n; ++u) { // перебираем 1-ую вершину для проверки на транзитивность for (int v = 0; v < n; ++v) { // перебираем 2-ую вершину for (int w = 0; w < n; ++w) { // перебираем 3-вершину if (u == v || u == w || v == w) { // Если какие-то 2 вершины равны, то пропускаем этот случай (По условию) continue; } if (G[u][v] && G[v][w] && !G[u][w]) { // Если есть ребра u -> v и v -> w, но нет u -> w, то граф нетранзитивный (По условию). Если граф нетранзитивный, то выводим "NO" и завершаем работу функции solve() cout << "NO"; return; } } } } cout << "YES"; // Если ни одна из проверок не нашла 3-ёх различных вершин, для которых не выполняется условие транзитивности, то выводим "YES" } int main() { solve(); return 0; }