#include <iostream> #include <cstring> #include <queue> const int N = 100010; using namespace std; int n; string str; vector<int> h[N]; // 邻接表 int degree[N]; // 记录顶点入度 priority_queue<int, vector<int>, greater<int>> q; // greater将最小的元素放在队首——>为了输出字典序最小的方案 int main() { while (cin >> n) { // 建图的同时记录入度 memset(h, 0, sizeof(h)); memset(degree, 0, sizeof(degree)); for (int i = 0; i < n; i++) { cin >> str; if (str.substr(6, 4) == "NULL") continue; for (int j = 10; j < str.size(); j += 6) h[i].push_back(str[j] - '0'), degree[str[j] - '0']++; } // 初始化优先队列 for (int i = 0; i < n; i++) if (degree[i] == 0) q.push(i); // 拓扑排序 while (q.size() != 0) { // 出队 int ver = q.top(); q.pop(); // 打印 cout << "Task" << ver << " "; // 更新入度并入队 for (int i = 0; i < h[ver].size(); i++) if (--degree[h[ver][i]] == 0) q.push(h[ver][i]); } cout << endl; } }