Sunday, May 3, 2015

UVa - 11060 - Beverages

Problem Link: 11060 - Beverages
  1. #include <bits/stdc++.h>
  2. #define S 103
  3. using namespace std;
  4.  
  5. vector <int> Order[S];
  6. queue <int> ans;
  7. map <string, int> Bev;
  8. map <int, string> Ans;
  9. int cn, indegree[S];
  10.  
  11. int main(){
  12.     string Beverages, x, y;
  13.     int n, m, cs = 0;
  14.     while(cin >> n){
  15.         for(int i = 1; i <= n; i++){
  16.             cin >> Beverages;
  17.             Bev[Beverages] = i;
  18.             Ans[i] = Beverages;
  19.         }
  20.         memset(indegree, 0sizeof(indegree));
  21.         cin >> m;
  22.         for(int i = 0; i < m; i++){
  23.             cin >> x >> y;
  24.             Order[Bev[x]].push_back(Bev[y]);
  25.             indegree[Bev[y]]++;
  26.         }
  27.         bool f = true;
  28.         while(f){
  29.             int cn = 0;
  30.             for(int i = 1; i <= n; i++){
  31.                 if(!indegree[i]){
  32.                     indegree[i] = -1;
  33.                     ans.push(i);
  34.                     int sz = Order[i].size();
  35.                     for(int z = 0; z < sz; z++)indegree[Order[i][z]]--;
  36.                     break;
  37.                 }
  38.                 cn++;
  39.             }
  40.             if(cn == n)break;
  41.         }
  42.         cout << "Case #" << ++cs << ": Dilbert should drink beverages in this order:";
  43.         while(!ans.empty()){
  44.             cout << " " << Ans[ans.front()];
  45.             ans.pop();
  46.         }
  47.         puts(".");
  48.         puts("");
  49.         Ans.clear(), Bev.clear();
  50.         for(int i = 0; i <= n; i++)Order[i].clear();
  51.     }
  52.     return 0;
  53. }

No comments:

Post a Comment