- 针对有向无环图的拓扑排序
- 构建图时记录每个点的入度
- 入度为零的点入队列,再带入其指向的点
- 与cur相连的点入度减一,可能有其他点同j相连
- 故待其入度减为零时才入队列
const int N = 1e5 + 10;
int h[N], e[N], ne[N], d[N];
int n, m, idx = 0;
vector<int> ret;
void add(int a, int b)
{
e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}
void topsort()
{
queue<int> m_next;
for(int i = 1; i <= n; ++i)
{
if(d[i] == 0)
{
m_next.push(i);
}
}
while(m_next.size())
{
int cur = m_next.front();
ret.push_back(cur);
m_next.pop();
for(int i = h[cur]; i != -1; i = ne[i])
{
int j = e[i];
d[j]--;
if(d[j] == 0)
{
m_next.push(j);
}
}
}
}
int main()
{
memset(h, -1, sizeof(h));
cin >> n >> m;
int a, b;
for(int i = 0; i < m; ++i)
{
cin >> a >> b;
add(a, b);
d[b]++;
}
topsort();
if(ret.size() == n)
for(auto &x : ret)
cout << x << " ";
else
cout << -1;
return 0;
}