给一个有向树,输出字典序最小的那个拓扑排序

一个完整的软件项目往往会包含很多由代码和文档组成的源文件。编译器在编译整个项目
的时候,可能需要按照依赖关系来依次编译每个源文件。比如,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;
}


猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/108561888