fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. ios::sync_with_stdio(false);
  5. cin.tie(nullptr);
  6.  
  7. int n, test_case = 1;
  8. while (cin >> n) {
  9. map<string, int> name_to_id;
  10. vector<string> id_to_name(n);
  11.  
  12. for (int i = 0; i < n; ++i) {
  13. cin >> id_to_name[i];
  14. name_to_id[id_to_name[i]] = i;
  15. }
  16.  
  17. int m;
  18. cin >> m;
  19. vector<vector<int>> adj(n);
  20. vector<int> in_deg(n, 0);
  21.  
  22. for (int i = 0; i < m; ++i) {
  23. string u_name, v_name;
  24. cin >> u_name >> v_name;
  25. int u = name_to_id[u_name];
  26. int v = name_to_id[v_name];
  27. adj[u].push_back(v);
  28. ++in_deg[v];
  29. }
  30.  
  31. // min-heap theo chỉ số từ điển nhỏ nhất
  32. priority_queue<int, vector<int>, greater<int>> pq;
  33. for (int i = 0; i < n; ++i) {
  34. if (in_deg[i] == 0) {
  35. pq.push(i);
  36. }
  37. }
  38.  
  39. vector<int> topo_order;
  40. while (!pq.empty()) {
  41. int u = pq.top();
  42. pq.pop();
  43. topo_order.push_back(u);
  44. for (int v : adj[u]) {
  45. --in_deg[v];
  46. if (in_deg[v] == 0) {
  47. pq.push(v);
  48. }
  49. }
  50. }
  51.  
  52. cout << "Case #" << test_case++ << ": Dilbert should drink beverages in this order:";
  53. for (int idx : topo_order) {
  54. cout << " " << id_to_name[idx];
  55. }
  56. cout << ".\n\n";
  57. }
  58.  
  59. return 0;
  60. }
  61.  
Success #stdin #stdout 0.01s 5320KB
stdin
5
A
B
C
D
E
5
C A
D A
B D
E B
E C
stdout
Case #1: Dilbert should drink beverages in this order: E B C D A.