class Solution {public: bool dfs(vector<vector<int>> &g, vector<int> &q, int i, int d = 0) { if (q[i] == -2) return false; // graph has a cycle if (d <= q[i]) return true; q[i] = -2; d++; for (int &j : g[i]) if (!dfs(g, q, j, d)) return false; q[i] = --d; return true; } vector<int> topo_sort(int k, vector<vector<int>> &conds) { vector<vector<int>> g(k+1,vector<int>()); for (auto &p : conds) g[p[1]].push_back(p[0]); vector<int> q(k+1,-1); for (int i = 1; i <= k; i++) { if (q[i] != -1) continue; if (!dfs(g, q, i)) return {}; } // keep only one number in each row/col vector<int> idx(k+1); iota(idx.begin(),idx.end(),0); sort(idx.begin(),idx.end(),[&](int i, int j) { return q[i] < q[j]; }); for (int i = 1; i <= k; i++) q[idx[i]] = k-i; // change direction return q; } vector<vector<int>> buildMatrix(int k, vector<vector<int>>& rowConditions, vector<vector<int>>& colConditions) { auto row = topo_sort(k, rowConditions); if (row.empty()) return {}; auto col = topo_sort(k, colConditions); if (col.empty()) return {}; vector<vector<int>> ans(k,vector<int>(k,0)); for (int i = 1; i <= k; i++) ans[row[i]][col[i]] = i; return ans; }};