任务调度

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

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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14412778.html