Advertisement
Alex_tz307

USACO 2018 US Open Contest, Gold Problem 2. Milking Order

May 31st, 2021
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. ifstream fin("milkorder.in");
  8. ofstream fout("milkorder.out");
  9.  
  10. const int MAXM = 5e4;
  11. int n, m;
  12. vector<int> edges[MAXM], sol;
  13.  
  14. bool check(int k) {
  15.   vector<vector<int>> G(n);
  16.   vector<int> in_deg(n);
  17.   for (int i = 0; i < k; ++i)
  18.     for (int j = 0; j < (int)edges[i].size() - 1; ++j) {
  19.       int u = edges[i][j], v = edges[i][j + 1];
  20.       G[u].emplace_back(v);
  21.       ++in_deg[v];
  22.     }
  23.   priority_queue<int, vector<int>, greater<int>> pq;
  24.   for (int u = 0; u < n; ++u)
  25.     if (in_deg[u] == 0)
  26.       pq.emplace(u);
  27.   vector<int> top_order;
  28.   for (int pas = 0; pas < n; ++pas) {
  29.     if (pq.empty())
  30.       return false;
  31.     int u = pq.top();
  32.     pq.pop();
  33.     top_order.emplace_back(u);
  34.     for (int v : G[u])
  35.       if (--in_deg[v] == 0)
  36.         pq.emplace(v);
  37.   }
  38.   sol = top_order;
  39.   return true;
  40. }
  41.  
  42. int main() {
  43.   fin >> n >> m;
  44.   for (int i = 0; i < m; ++i) {
  45.     int k;
  46.     fin >> k;
  47.     edges[i].resize(k);
  48.     for (int &u : edges[i]) {
  49.       fin >> u;
  50.       --u;
  51.     }
  52.   }
  53.   int st = 1, dr = m;
  54.   while (st <= dr) {
  55.     int mid = (st + dr) >> 1;
  56.     if (check(mid))
  57.       st = mid + 1;
  58.     else dr = mid - 1;
  59.   }
  60.   fout << sol[0] + 1;
  61.   for (int i = 1; i < (int)sol.size(); ++i)
  62.     fout << ' ' << sol[i] + 1;
  63.   return 0;
  64. }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement