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

  

posted @ 2021-04-07 20:06  Wise_4  阅读(62)  评论(0编辑  收藏  举报