Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma warning(disable : 4996)
- #include <iostream>
- #include <vector>
- #include <iterator>
- #include <algorithm>
- #include <set>
- #include <list>
- #include <limits>
- #include <queue>
- using namespace std;
- vector < vector<int> > g, gr , meta,metainv;
- vector<char> used;
- vector<int> order, component , d,com,price ,tin,tout,q;
- list <pair< vector<int>,int> > mg;
- vector<int>pred;
- void dfs1(int v) {
- used[v] = true;
- for (size_t i = 0; i<g[v].size(); ++i)
- if (!used[g[v][i]])
- dfs1(g[v][i]);
- order.push_back(v);
- }
- void dfs2(int v) {
- used[v] = true;
- component.push_back(v);
- for (size_t i = 0; i < gr[v].size(); ++i)
- if (!used[gr[v][i]])
- dfs2(gr[v][i]);
- }
- int main() {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- int n , csc =0;
- cin >> n;
- d.resize(n);
- g.resize(n);
- gr.resize(n);
- com.resize(n);
- for (int i = 0 ; i < n ; i++) cin >> d[i];
- for ( int i = 0 , v ,k; i <n ; i++) {
- cin >> k;
- for (int j = 0; j < k; j++)
- {
- cin >> v;
- g[i].push_back(v);
- gr[v].push_back(i);
- }
- }
- used.assign(n, false);
- for (int i = 0; i<n; ++i)
- if (!used[i])
- dfs1(i);
- used.assign(n, false);
- for (int i = 0; i<n; ++i) {
- int v = order[n - 1 - i];
- if (!used[v]) {
- dfs2(v);
- //copy(component.begin(), component.end(), ostream_iterator<int>(cout, " "));
- //cout << endl;
- int minim = int(1e8);
- for (int j = 0 ; j < component.size() ; j++) minim = min(minim,d[component[j]]), com[component[j]] = csc;
- csc++;
- mg.push_back(make_pair(component,minim));
- component.clear();
- }
- }
- //meta.resize(csc);
- meta.resize(csc);
- q.resize(csc);
- /*for (auto it = mg.begin(); it != mg.end() ; it++)
- {
- copy(it->first.begin(),it->first.end(),ostream_iterator<int>(cout," "));
- cout <<" : " << it->second << endl;
- }*/
- for (auto it = mg.begin(); it != mg.end() ; it++)
- {
- for(int i = 0; i < it->first.size() ;i++)
- {
- for (int j = 0 ; j < g[it->first[i]].size() ; j++)
- {
- if (com[ g[it->first[i]][j] ] != com[it->first[i]] )
- {
- meta[com[it->first[i]]].push_back(com[ g[it->first[i]][j] ]);
- q.push_back(com[ g[it->first[i]][j] ] );
- }
- }
- }
- }
- /*for (int i = 0 ;i <metainv.size() ; i++)
- {
- cout << i <<" : ";
- for (int j = 0 ; j <metainv[i].size() ; j++ )
- cout << metainv[i][j] << " ";
- cout << endl;
- }*/
- price.reserve(csc);
- for (auto it = mg.begin() ; it != mg.end() ; it++)
- price.push_back(it->second);
- //copy(price.begin(),price.end(),ostream_iterator<int>(cout," ")); cout << endl;
- //tin.resize(csc);
- //tout.resize(csc);
- /*for (int i = 0; i < metainv.size() ; i++)
- if (metainv[i].size() != 0 ) {start = i; break;}*/
- //price[i] = min(Min,price[i]);
- //Min = int(1e8);
- //u.assign(u.size(),0);
- /*for ( int i = 0 ; i < meta.size() ; i++ )
- for (int j = 0 ; j < meta[i].size() ; j++ )
- {
- if (tin[i] < tin[meta[i][j]] && tout[i] > tout[meta[i][j]])
- {
- price[i] = min(price[meta[i][j]],price[i]);
- }
- }*/
- //copy(com.begin(),com.end(),ostream_iterator<int>(cout," ")); cout << endl;
- //copy(price.begin(),price.end(),ostream_iterator<int>(cout," ")); cout << endl;
- //copy(tin.begin(),tin.end(),ostream_iterator<int>(cout," ")); cout << endl;
- //copy(tout.begin(),tout.end(),ostream_iterator<int>(cout," ")); cout << endl;
- for (int i =0 ; i < n ;i++)
- cout << price[com[i]] << " ";
- return 0 ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement