拓扑排序
#include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int N = 1001010; int e[N], ne[N], head[N], tot;//存储临接表 int n, m, d[N], top[N], ans = 1;//d数组存入边的个数,top存储拓扑序, ans计数 void add(int a, int b) { e[tot] = b; ne[tot] = head[a]; head[a] = tot++; } bool topsort() { queue<int> q; for(int i = 1; i <= n; i++) { if(d[i] == 0) {//将所有入队为0的点存入队列中 q.push(i); } } while(q.size()) { int t = q.front(); top[ans++] = t;//存入拓扑序 q.pop(); for(int i = head[t]; i != -1; i = ne[i]) {//将所有是t点为入度的点,数值减一 int j = e[i]; d[j]--; if(d[j] == 0) { q.push(j);//如果此时入度为0,存入队列 } } } if(n == ans - 1) {//因为最后一个点,存完会多加一下 return 1; } else { return 0; } } int main() { cin >> n >> m; memset(head, -1, sizeof(head));//将所有点的链表头为-1 while(m--) { int a, b; cin >> a >> b; add(a, b); d[b]++; //记录入度边数 } if(topsort()) { for(int i = 1; i <= n; i++) { cout << top[i] << " "; } } else { cout << "-1" << endl; } return 0; }