拓扑排序
要用list,不能用vector,确保删除边的开销为O(1)。
因为主循环中,总共要从队列中pop掉n个数(点),然后总共要删e条边,删点和边的开销都是O(1)。所以整个时间复杂度就是O(n+e)。
如果最终还剩下边,证明存在环,sort失败。
1 bool sort(list> &graph, int n, vector &ans) { 2 vector prev(n, 0); 3 for (auto it = graph.begin(); it != graph.end(); it++) { 4 prev[it->second]++; 5 } 6 7 queue q; 8 for (int i = 0; i < n; ++i) { 9 if (prev[i] == 0) q.push(i);10 }11 12 while (!q.empty()) {13 int top = q.front();14 q.pop();15 ans.push_back(top);16 17 for (auto it = graph.begin(); it != graph.end(); ) {18 if (it->first == top) {19 prev[it->second]--;20 if (prev[it->second] == 0) q.push(it->second);21 it = graph.erase(it);22 } else {23 it++;24 }25 }26 }27 28 return graph.empty();29 }