Guest User

Untitled

a guest
Jan 20th, 2018
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<utility>
  5. #include<queue>
  6. #include<stack>
  7. using namespace std;
  8.  
  9. class UF {
  10.   int *id, cnt, *sz;
  11.   public:
  12. // Create an empty union find data structure with N isolated sets.
  13. UF(int N) {
  14.     cnt = N; id = new int[N]; sz = new int[N];
  15.     for (int i = 0; i<N; i++)  id[i] = i, sz[i] = 1; }
  16. ~UF() { delete[] id; delete[] sz; }
  17.  
  18. // Return the id of component corresponding to object p.
  19. int find(int p) {
  20.     int root = p;
  21.     while (root != id[root])    root = id[root];
  22.     while (p != root) { int newp = id[p]; id[p] = root; p = newp; }
  23.     return root;
  24. }
  25. // Replace sets containing x and y with their union.
  26. void merge(int x, int y) {
  27.     int i = find(x); int j = find(y); if (i == j) return;
  28.     // make smaller root point to larger one
  29.     if (sz[i] < sz[j]) { id[i] = j, sz[j] += sz[i]; }
  30.     else { id[j] = i, sz[i] += sz[j]; }
  31.     cnt--;
  32. }
  33. // Are objects x and y in the same set?
  34. bool connected(int x, int y) { return find(x) == find(y); }
  35. // Return the number of disjoint sets.
  36. int count() { return cnt; }
  37. };
  38.  
  39. int N, K, T;
  40. vector<pair<int, int> > v[50002];
  41. vector<bool> vis;
  42. int res;
  43. UF ufind = UF(50004);
  44.  
  45. void dfs(int z, int w) {
  46.     stack<int> s;
  47.     s.push(z);
  48.     while(!s.empty()) {
  49.         int n = s.top();
  50.         s.pop();
  51.         if(!vis[n]) {
  52.             vis[n] = true;
  53.             for(int i=0;i<v[n].size();i++) {
  54.                 if(v[n][i].second >= w && !ufind.connected(n, v[n][i].first)) {
  55.                     ufind.merge(n, v[n][i].first);
  56.                     res--;
  57.                     s.push(v[n][i].first);
  58.                 }
  59.             }
  60.         }
  61.     }
  62. }
  63.  
  64. int main() {
  65.     std::ios_base::sync_with_stdio (false);
  66.     cin>>N>>K>>T;
  67.     res = N;
  68.     N = N+1; //usa indici partendo da 1
  69.     vis.resize(N);
  70.  
  71.     for(int i=0;i<K;i++) {
  72.         int a,b, V;
  73.         cin>>a>>b>>V;
  74.         v[a].push_back(make_pair(b,V));
  75.         v[b].push_back(make_pair(a,V));
  76.     }
  77.  
  78.     int sol[100002];
  79.     int ord[100002];
  80.     int wi[100002];
  81.  
  82.     for(int t=0;t<T;t++) {
  83.         int w;
  84.         cin>>w;
  85.         ord[t] = w;
  86.         wi[t] = w;
  87.     }
  88.  
  89.     sort(wi, wi + T);
  90.  
  91.     for(int t=0;t<T;t++) {
  92.         int w = wi[T - t - 1];
  93.         fill(vis.begin(), vis.end(), false);
  94.         for(int i=1;i<N;i++) {
  95.             if(!vis[i]) {
  96.                 dfs(i, w);
  97.             }
  98.         }
  99.  
  100.         sol[w] = res;
  101.     }
  102.  
  103.     for(int t=0;t<T;t++) cout<<sol[ord[t]]<<endl;
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment