#include <cstdio> #include <cstdlib> #include <stack> #include <algorithm> using namespace std; const int MAXN = 50; int mat[MAXN][MAXN], output[MAXN], indegree[MAXN]; int n, outputCnt, current; stack<int> st; bool TopologicalSort() { outputCnt = 0; while (!st.empty()) st.pop(); for (int i = 0;i < n;i++) indegree[i] = 0; for (int i = 0;i < n;i++) { for (int j = 0;j < n;j++) { if (mat[i][j]) indegree[j]++; } } for (int i = 0;i < n;i++) { if (indegree[i] == 0) { st.push(i); } } while (!st.empty()) { current = st.top(); st.pop(); output[outputCnt++] = current; for (int i = 0;i < n;i++) { if (mat[current][i]) { indegree[i]--; if (indegree[i] == 0) { st.push(i); } } } } return (outputCnt == n); } int main() { scanf("%d", &n); for (int i = 0;i < n;i++) { for (int j = 0;j < n;j++) { scanf("%d", &mat[i][j]); } } if (TopologicalSort()) { for (int i = 0;i < n;i++) { printf("%d ", output[i]); } puts(""); } else { puts("ERROR"); } return 0; } /************************************************************** Problem: 2164 User: admin Language: C++ Result: Accepted Time:8 ms Memory:1276 kb ****************************************************************/