小白进阶之路-HDU - 4857
错误原因:正向建图然后小根堆处理拓扑排序,但是有可能在某一层的节点上,小的还未进堆,比较大的就已经先 出堆了。
错误数据:
我的做法的出队:1 2 4 5 3,正确答案是:1 2 5 3 4.故采用反向建图,并将小根堆换为大根堆
思考:错误其实没啥好怕的,重要的就是在错误之后如何快速找出自己错误的原因,要不然做多少次都是错的多可怕
正确代码:
vector<int> e[30010]; int in[30010]; void solve() { int n,m;cin >> n >> m; for(int i = 1;i <= n;++i) e[i].clear(),in[i] = 0; for(int i = 1;i <= m;++i) { int u,v;cin >> v >> u; e[u].push_back(v); in[v]++; } priority_queue<int> q; for(int i = 1;i <= n;++i) if(in[i] == 0) q.push(i); vector<int> ans; while(!q.empty()) { int u = q.top();q.pop(); ans.push_back(u); for(int v : e[u]) { in[v]--; if(in[v] == 0) q.push(v); } } reverse(ans.begin(),ans.end()); for(int i = 0;i < ans.size();++i) { if(i == 0) cout << ans[i]; else cout << ' ' << ans[i]; } cout << endl; } int main() { IO int t;cin >> t; while(t--) solve(); }