一个完整的软件项目往往会包含很多由代码和文档组成的源文件。编译器在编译整个项目
的时候,可能需要按照依赖关系来依次编译每个源文件。比如,A.cpp依赖B.cpp,那么
在编译的时候,编译器需要先编译B.cpp,才能再编译A.cpp。假设现有0,1,2,3四
个文件,0号文件依赖1号文件,1号文件依赖2号文件,3号文件依赖1号文件,则源文件的
编译顺序为2,1,0,3或2,1,3,0。现给出文件依赖关系,如1,2,-1,1,表示0号文件依赖1号
文件,1号文件依赖2号文件,2号文件没有依赖,3号文件依赖1号文件。请补充完整程
序,返回正确的编译顺序。注意如有同时可以编译多个文件的情况,按数字升序返回一种
情况即可,比如前述案例输出为:2,1,0,3
输入
"1,2,-1,1"
输出
"2,1,0,3"
#include<bits/stdc++.h>
using namespace std;
string compileSeq(string input) {
int n = input.size();
vector<vector<int> > graph(n, vector<int> ());
int id = 0;
priority_queue<int, vector<int>, greater<int> > q;
for(int i = 0; i < n; ++i)
{
string nums = "";
while(i < n && input[i] != ',') {
nums.push_back(input[i]);
++i;
}
int num = stoi(nums);
if(num != -1)
graph[num].push_back(id);
else
q.push(id);
++id;
}
string res = "";
while(!q.empty()) {
int top = q.top();
q.pop();
res += to_string(top) + ',';
sort(graph[top].begin(), graph[top].end());
for(int i = 0; i < graph[top].size(); ++i)
q.push(graph[top][i]);
}
res.pop_back();
return res;
}
int main()
{
string str = "1,2,-1,1";
cout<<compileSeq(str)<<endl;
return 0;
}