#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
/**
* Recursive helper for DFS topological sort and cycle detection
* state[u] == 0: Unvisited
* state[u] == 1: Visiting (in current recursion stack)
* state[u] == 2: Visited (fully processed)
*/
bool buildDFS(const string& u,
unordered_map<string, vector<string>>& adj,
unordered_map<string, int>& state,
vector<string>& order) {
state[u] = 1; // Mark as "Visiting"
for (const string& v : adj[u]) {
if (state[v] == 1) return false; // Cycle detected!
if (state[v] == 0) {
if (!buildDFS(v, adj, state, order)) return false;
}
}
state[u] = 2; // Mark as "Visited"
order.push_back(u); // Add to build order after all dependencies are done
return true;
}
/**
* Main function to get the build order
*/
vector<string> getBuildOrder(string target, unordered_map<string, vector<string>>& adj) {
vector<string> order;
unordered_map<string, int> state;
if (buildDFS(target, adj, state, order)) {
return order;
}
return {}; // Return empty if cycle found
}
int main() {
// Adjacency list representation of the prompt graph
unordered_map<string, vector<string>> adj = {
{"Service", {"Adapters", "Core", "Utils"}},
{"Adapters", {"Interfaces"}},
{"Core", {"Types"}},
{"Utils", {"Types"}},
{"Interfaces", {"Types"}},
{"Types", {}}
};
vector<string> result = getBuildOrder("Service", adj);
if (result.empty()) {
cout << "Error: Circular dependency detected!" << endl;
} else {
for (size_t i = 0; i < result.size(); ++i) {
cout << result[i] << (i == result.size() - 1 ? "" : " > ");
}
cout << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKioKICogUmVjdXJzaXZlIGhlbHBlciBmb3IgREZTIHRvcG9sb2dpY2FsIHNvcnQgYW5kIGN5Y2xlIGRldGVjdGlvbgogKiBzdGF0ZVt1XSA9PSAwOiBVbnZpc2l0ZWQKICogc3RhdGVbdV0gPT0gMTogVmlzaXRpbmcgKGluIGN1cnJlbnQgcmVjdXJzaW9uIHN0YWNrKQogKiBzdGF0ZVt1XSA9PSAyOiBWaXNpdGVkIChmdWxseSBwcm9jZXNzZWQpCiAqLwpib29sIGJ1aWxkREZTKGNvbnN0IHN0cmluZyYgdSwgCiAgICAgICAgICAgICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsIHZlY3RvcjxzdHJpbmc+PiYgYWRqLCAKICAgICAgICAgICAgICB1bm9yZGVyZWRfbWFwPHN0cmluZywgaW50PiYgc3RhdGUsIAogICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+JiBvcmRlcikgewogICAgCiAgICBzdGF0ZVt1XSA9IDE7IC8vIE1hcmsgYXMgIlZpc2l0aW5nIgoKICAgIGZvciAoY29uc3Qgc3RyaW5nJiB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHN0YXRlW3ZdID09IDEpIHJldHVybiBmYWxzZTsgLy8gQ3ljbGUgZGV0ZWN0ZWQhCiAgICAgICAgaWYgKHN0YXRlW3ZdID09IDApIHsKICAgICAgICAgICAgaWYgKCFidWlsZERGUyh2LCBhZGosIHN0YXRlLCBvcmRlcikpIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGVbdV0gPSAyOyAvLyBNYXJrIGFzICJWaXNpdGVkIgogICAgb3JkZXIucHVzaF9iYWNrKHUpOyAvLyBBZGQgdG8gYnVpbGQgb3JkZXIgYWZ0ZXIgYWxsIGRlcGVuZGVuY2llcyBhcmUgZG9uZQogICAgcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBNYWluIGZ1bmN0aW9uIHRvIGdldCB0aGUgYnVpbGQgb3JkZXIKICovCnZlY3RvcjxzdHJpbmc+IGdldEJ1aWxkT3JkZXIoc3RyaW5nIHRhcmdldCwgdW5vcmRlcmVkX21hcDxzdHJpbmcsIHZlY3RvcjxzdHJpbmc+PiYgYWRqKSB7CiAgICB2ZWN0b3I8c3RyaW5nPiBvcmRlcjsKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ+IHN0YXRlOyAKCiAgICBpZiAoYnVpbGRERlModGFyZ2V0LCBhZGosIHN0YXRlLCBvcmRlcikpIHsKICAgICAgICByZXR1cm4gb3JkZXI7CiAgICB9CiAgICByZXR1cm4ge307IC8vIFJldHVybiBlbXB0eSBpZiBjeWNsZSBmb3VuZAp9CgppbnQgbWFpbigpIHsKICAgIC8vIEFkamFjZW5jeSBsaXN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9tcHQgZ3JhcGgKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLCB2ZWN0b3I8c3RyaW5nPj4gYWRqID0gewogICAgICAgIHsiU2VydmljZSIsIHsiQWRhcHRlcnMiLCAiQ29yZSIsICJVdGlscyJ9fSwKICAgICAgICB7IkFkYXB0ZXJzIiwgeyJJbnRlcmZhY2VzIn19LAogICAgICAgIHsiQ29yZSIsIHsiVHlwZXMifX0sCiAgICAgICAgeyJVdGlscyIsIHsiVHlwZXMifX0sCiAgICAgICAgeyJJbnRlcmZhY2VzIiwgeyJUeXBlcyJ9fSwKICAgICAgICB7IlR5cGVzIiwge319CiAgICB9OwoKICAgIHZlY3RvcjxzdHJpbmc+IHJlc3VsdCA9IGdldEJ1aWxkT3JkZXIoIlNlcnZpY2UiLCBhZGopOwoKICAgIGlmIChyZXN1bHQuZW1wdHkoKSkgewogICAgICAgIGNvdXQgPDwgIkVycm9yOiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkISIgPDwgZW5kbDsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgY291dCA8PCByZXN1bHRbaV0gPDwgKGkgPT0gcmVzdWx0LnNpemUoKSAtIDEgPyAiIiA6ICIgPiAiKTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9