• 任务调度


    注意对全为孤立点的情况进行处理。

    const int N=1e5+10;
    set<int> node;
    vector<int> g[N];
    int din[N];
    bool vis[N];
    vector<int> res;
    int n;
    
    void bfs(int st)
    {
        priority_queue<int,vector<int>,greater<int> > heap;
        heap.push(st);
    
        while(heap.size())
        {
            int t=heap.top();
            heap.pop();
    
            vis[t]=true;
    
            res.pb(t);
    
            for(int i=0;i<g[t].size();i++)
            {
                int j=g[t][i];
                if(--din[j] == 0)
                    heap.push(j);
            }
        }
    }
    
    int trans(string task)
    {
        return stoi(task.substr(4));
    }
    
    int main()
    {
        while(cin>>n)
        {
            for(int i=0;i<n;i++) g[i].clear(),din[i]=0,vis[i]=0;
            node.clear(),res.clear();
    
            for(int i=0;i<n;i++)
            {
                string line;
                cin>>line;
    
                int l=line.find('('),r=line.find(')');
                string task;
                task=line.substr(0,l);
                int uid=trans(task);
                node.insert(uid);
    
                int lpos=l+1,rpos=l+1;
                if(line.substr(lpos,r-lpos) == "NULL")
                    continue;
    
                while(rpos != string::npos)
                {
                    rpos=line.find(',',lpos);
                    if(rpos == string::npos)
                        task=line.substr(lpos,r-lpos);
                    else
                        task=line.substr(lpos,rpos-lpos);
    
                    int vid=trans(task);
                    g[uid].pb(vid);
                    node.insert(vid);
                    din[vid]++;
                    lpos=rpos+1;
                }
            }
    
            for(auto t:node)
                if(!vis[t] && din[t] == 0)
                {
                    vis[t]=true;
                    bfs(t);
                }
    
            for(int i=0;i<res.size();i++)
            {
                string s="Task"+to_string(res[i]);
                if(i) cout<<' '<<s;
                else cout<<s;
            }
            cout<<endl;
        }
    
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    fork 入门
    java 注解 @Retention @interface 元数据
    JAVA泛型简析
    http数据流 gzip解压方法分析
    gdb调试提示 Missing separate debuginfos
    Vue2.x响应式原理
    观察者模式
    优秀博客收集
    切换npm源的方式
    前端模块化之ES Module
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14412778.html
Copyright © 2020-2023  润新知