拓扑排序

#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;
}


全部评论

相关推荐

06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
07-08 13:48
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务