Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #pragma warning(disable : 4996)
  2. #include <iostream>
  3. #include <vector>
  4. #include <iterator>
  5. #include <algorithm>
  6. #include <set>
  7. #include <list>
  8. #include <limits>
  9. #include <queue>
  10.  
  11. using namespace std;
  12. vector < vector<int> > g, gr , meta,metainv;
  13. vector<char> used;
  14. vector<int> order, component , d,com,price ,tin,tout,q;
  15. list <pair< vector<int>,int> > mg;
  16. vector<int>pred;
  17.  
  18.  
  19. void dfs1(int v) {
  20.     used[v] = true;
  21.     for (size_t i = 0; i<g[v].size(); ++i)
  22.     if (!used[g[v][i]])
  23.         dfs1(g[v][i]);
  24.     order.push_back(v);
  25. }
  26.  
  27. void dfs2(int v) {
  28.     used[v] = true;
  29.     component.push_back(v);
  30.     for (size_t i = 0; i < gr[v].size(); ++i)
  31.     if (!used[gr[v][i]])
  32.         dfs2(gr[v][i]);
  33. }
  34.  
  35.  
  36. int main() {
  37.     freopen("input.txt", "r", stdin);
  38.     freopen("output.txt", "w", stdout);
  39.     int n , csc =0;
  40.     cin >> n;
  41.     d.resize(n);
  42.     g.resize(n);
  43.     gr.resize(n);
  44.     com.resize(n);
  45.     for (int i = 0 ; i < n ; i++) cin >> d[i];
  46.     for ( int i = 0 , v ,k; i  <n ; i++) {
  47.         cin >> k;
  48.         for (int j = 0; j < k; j++)
  49.         {
  50.             cin >> v;
  51.             g[i].push_back(v);
  52.             gr[v].push_back(i);
  53.         }
  54.     }
  55.  
  56.     used.assign(n, false);
  57.  
  58.     for (int i = 0; i<n; ++i)
  59.     if (!used[i])
  60.         dfs1(i);
  61.     used.assign(n, false);
  62.     for (int i = 0; i<n; ++i) {
  63.         int v = order[n - 1 - i];
  64.         if (!used[v]) {
  65.             dfs2(v);
  66.             //copy(component.begin(), component.end(), ostream_iterator<int>(cout, " "));
  67.             //cout << endl;
  68.             int minim = int(1e8);
  69.             for (int j = 0 ; j < component.size() ; j++) minim = min(minim,d[component[j]]), com[component[j]] = csc;
  70.             csc++;
  71.             mg.push_back(make_pair(component,minim));
  72.             component.clear();
  73.         }
  74.     }
  75.     //meta.resize(csc);
  76.     meta.resize(csc);
  77.     q.resize(csc);
  78.     /*for (auto it = mg.begin(); it != mg.end() ; it++)
  79.     {
  80.         copy(it->first.begin(),it->first.end(),ostream_iterator<int>(cout," "));
  81.         cout <<" : " << it->second << endl;
  82.     }*/
  83.     for (auto it = mg.begin(); it != mg.end() ; it++)
  84.     {
  85.         for(int i = 0; i < it->first.size() ;i++)
  86.         {
  87.             for (int j = 0 ; j < g[it->first[i]].size() ; j++)
  88.             {
  89.                 if (com[ g[it->first[i]][j] ] != com[it->first[i]] )
  90.                 {
  91.                     meta[com[it->first[i]]].push_back(com[ g[it->first[i]][j] ]);
  92.                     q.push_back(com[ g[it->first[i]][j] ] );
  93.                 }
  94.                    
  95.             }
  96.         }
  97.     }
  98.  
  99.     /*for (int i = 0 ;i <metainv.size() ; i++)
  100.     {  
  101.         cout << i <<" : ";
  102.         for (int j = 0 ; j <metainv[i].size() ; j++ )
  103.             cout << metainv[i][j] << " ";
  104.         cout << endl;
  105.     }*/
  106.     price.reserve(csc);
  107.     for (auto it = mg.begin() ; it != mg.end() ; it++)
  108.         price.push_back(it->second);
  109.     //copy(price.begin(),price.end(),ostream_iterator<int>(cout," ")); cout << endl;
  110.     //tin.resize(csc);
  111.     //tout.resize(csc);
  112.     /*for (int i = 0; i < metainv.size() ; i++)
  113.         if (metainv[i].size() != 0 ) {start = i; break;}*/
  114.         //price[i] = min(Min,price[i]);
  115.         //Min = int(1e8);
  116.         //u.assign(u.size(),0);
  117.  
  118.     /*for ( int i = 0 ; i < meta.size() ; i++ )
  119.         for (int j = 0 ; j < meta[i].size() ; j++ )
  120.         {
  121.             if (tin[i] < tin[meta[i][j]] && tout[i] > tout[meta[i][j]])
  122.             {
  123.                 price[i] = min(price[meta[i][j]],price[i]);
  124.             }
  125.         }*/
  126.     //copy(com.begin(),com.end(),ostream_iterator<int>(cout," ")); cout << endl;
  127.     //copy(price.begin(),price.end(),ostream_iterator<int>(cout," ")); cout << endl;
  128.     //copy(tin.begin(),tin.end(),ostream_iterator<int>(cout," ")); cout << endl;
  129.     //copy(tout.begin(),tout.end(),ostream_iterator<int>(cout," ")); cout << endl;
  130.  
  131.    
  132.  
  133.  
  134.     for (int i =0 ; i < n ;i++)
  135.         cout << price[com[i]] << " ";
  136.     return 0 ;
  137.    
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement