#include <cstddef> #include <iostream> #include <queue> #include <vector> using namespace std; #define Max 200005 struct arcNode { int arc; arcNode* next; }; struct vexNode { arcNode* frist; }; int main() { vector<vexNode> vex; vector<int> t1, t2; int n, m; cin >> n; cin >> m; //输入数据 for (int i = 0; i < m; i++) { int a, b; cin >> a; cin >> b; t1.push_back(a); t2.push_back(b); } //初始化邻接表,并将数据放入 for (int i = 0; i < n; i++) { vexNode temp; //由于指针访问不对劲,放弃第一个节点 temp.frist = new arcNode(); temp.frist->arc=-1; temp.frist->next=NULL; vex.push_back(temp); } for (int i = 0; i < m; i++) { arcNode* temp = new arcNode(); temp->arc = t2[i] - 1; temp->next = NULL; arcNode* p = vex[t1[i] - 1].frist; while (p->next) { p = p->next; } p->next = temp; } // 存放入度为0的节点的队列 queue<int> que; // 存放每一个节点的入度,先进行初始化 vector<int> du; for (int i = 0; i < n; i++) { du.push_back(0); } //计算当前顶点的入度 for (int i = 0; i < n; i++) { du.push_back(0); arcNode* p = vex[i].frist; p = p->next; while (p) { du[p->arc]++; p = p->next; } } //将入度为0的顶点入队 for (int j = 0; j < n; j++) if (du[j] == 0) que.push(j); // 存放可能要输出的顶点数目 vector<int> aout; // 将入度为0顶点移除,并计算剩余顶点的入度 while (!que.empty()) { int i = que.front(); que.pop(); aout.push_back(i); arcNode* p = vex[i].frist; p = p->next; while (p) { if (--du[p->arc] == 0) que.push(p->arc); p = p->next; } } // 判断处理后,入度为0的顶点是否是全部顶点,如果不是说明存在环 if (aout.size() < n) cout << "-1" << endl; else { cout << aout[0] + 1; for (int i = 1; i < n; i++) { cout << " " << aout[i] + 1; } cout << endl; } return 0; }