任务调度
注意对全为孤立点的情况进行处理。
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;
}