拓扑排序

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<unordered_set>
#include<functional>
#include<vector>
using namespace std;
const int N = 2e5+ 10;
int n,m,k,in,du[N],u,v;
int nxt[N], a[N];
queue<int> q;
vector<int> g[N];
unordered_set<int> st;
int head;
int main()
{
    memset(du, 0, sizeof du);
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> u >> v;
        g[u].push_back(v);
        du[v] ++;
    }
    cin >> k;
    for(int i = 1; i <= k; i++)
    {
        cin >> a[i];
        st.insert(a[i]);
    }
    for(int i = 1; i <= n; i++)
    {
        if(du[i] == 0 && !st.count(i)) q.push(i);
    }
    vector<int> res;
    bool v[N];
    memset(v,0,sizeof v);
    while(q.size())
    {
        auto i = q.front();
        res.push_back(i);
        q.pop();
        for(auto j: g[i])
        {
            du[j]--;
            if(du[j] == 0 && !st.count(j) && !v[j]) q.push(j), v[j] = 1;
        }
    }
    for(int i = 1; i <= k; i++)
    {
        if(du[a[i]] != 0) 
        {
            cout << -1 << endl;
            return 0;
        }else{
            res.push_back(a[i]);
            for(auto j: g[a[i]])
            {
                du[j]--;
                if(!st.count(j) && !v[j] && du[j] == 0) q.push(j), v[j] = 1;
            }
        }
    }
    while(q.size())
    {
        auto i = q.front();
        res.push_back(i);
        q.pop();
        for(auto j: g[i])
        {
            du[j]--;
            if(du[j] == 0 && !st.count(j) && !v[j]) q.push(j), v[j] = 1;
        }
    }
    if(res.size() != n)
    {
        cout<<-1<<endl;
        return 0;
    }
    for(auto i: res) cout << i << ' ';
    return 0;
}


全部评论

相关推荐

03-31 16:42
已编辑
郑州西亚斯学院 后端
Java抽象带篮子:你简历少了几个模块看上去就感觉信息很少,简历怎么写可以看看我发的帖子
点赞 评论 收藏
分享
喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务