小白进阶之路-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();
}

浙公网安备 33010602011771号