考点:拓扑排序
注意:字符串的编号如何确定?每个字符串后面的数字表示编号吗?一定是Task?
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE=1001;
struct node {
string name;
vector<string> sons;
int in;
};
map<string,node> mp;//结点名称与结点的映射
vector<node> v;//有向图的邻接链表
vector<string> vs;//存储一行字符串中所有任务的名字
void split(string s);
int main() {
int n;
cin>>n;
string s;
getchar();
for(int i=0; i<n; i++) {
getline(cin,s);
split(s);
node t;
t.name=vs[0];
int l=s.length();
for(int j=1; j<vs.size(); j++) {
t.sons.push_back(vs[j]);
}
t.in=0;
mp[t.name]=t;
v.push_back(t);
}
for(int i=0; i<v.size(); i++) {//计算入度
node t=v[i];
for(int j=0; j<t.sons.size(); j++) {
mp[t.sons[j]].in++;
}
}
priority_queue<string,vector<string>,greater<string> > q;//小顶堆
for(auto it=mp.begin(); it!=mp.end(); it++) {
if(it->second.in==0) {
q.push(it->first);
}
}
while(!q.empty()) {
string s=q.top();
cout<<s;
q.pop();
for(int i=0; i<mp[s].sons.size(); i++) {
string t=mp[s].sons[i];
mp[t].in--;
if(mp[t].in==0) {
q.push(t);
}
}
if(q.empty()) {
cout<<endl;
} else {
cout<<" ";
}
}
return 0;
}
void split(string s) {
string t="";
vs.clear();
int l=s.length();
for(int i=0; i<l; i++) {
if(s[i]=='('||s[i]==')'||s[i]==',') {
if(t=="NULL") {
break;
}
vs.push_back(t);
t="";
continue;
}
t+=s[i];
}
}