Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N=1e5;
  6.  
  7. int parent[N];
  8. int ranked[N];
  9.  
  10. void make_set(int v){
  11.     parent[v]=v;
  12.     ranked[v]=0;
  13. }
  14.  
  15. int find_set(int v){
  16.     if (v==parent[v]){
  17.         return v;
  18.     }
  19.     return parent[v]=find_set(parent[v]);
  20. }
  21.  
  22. bool union_sets (int a, int b){
  23.     a=find_set(a);
  24.     b=find_set(b);
  25.     if (a!=b){
  26.         if (ranked[a]<ranked[b]){
  27.             swap(a,b);
  28.         }
  29.         parent[b]=a;
  30.         if (ranked[a]==ranked[b]){
  31.             ++ranked[a];
  32.         }
  33.         return true;
  34.     }
  35.     else{
  36.         return false;
  37.     }
  38. }
  39.  
  40. struct edge {
  41.     int f,s;
  42.     bool b;
  43. };
  44.  
  45. int n,m,q;
  46. vector<edge> edges;
  47. vector<int> rep;
  48. vector<int> graph[N];
  49. int comp [N];
  50.  
  51. void dfs (int v, int t) {
  52.     comp[v]=t;
  53.     for (auto to : graph[v]){
  54.         if (!comp[to]){
  55.             dfs(to,t);
  56.         }
  57.     }
  58. }
  59.  
  60. int main (){
  61.     ios_base::sync_with_stdio(false);
  62.     cin.tie(nullptr);
  63.     cout.tie(nullptr);
  64.     cin >> n >> m;
  65.     for (int i=0; i<m; ++i){
  66.         edge tmp{};
  67.         int x,y; cin >> x >> y;
  68.         x--;
  69.         y--;
  70.         tmp.f=x;
  71.         tmp.s=y;
  72.         tmp.b=true;
  73.         edges.emplace_back(tmp);
  74.     }
  75.     cin >> q;
  76.     for (int i=0; i<q; ++i){
  77.         int k; cin >> k;
  78.         k--;
  79.         edges[k].b=false;
  80.         rep.emplace_back(k);
  81.     }
  82.     for (auto elem : edges){
  83.         if (elem.b){
  84.             graph[elem.f].emplace_back(elem.s);
  85.             graph[elem.s].emplace_back(elem.f);
  86.         }
  87.     }
  88.     int k=1;
  89.     for (int i=0; i<n; ++i){
  90.         if (!comp[i]){
  91.             dfs(i,k);
  92.             k++;
  93.         }
  94.     }
  95.     int ans=k-1;
  96.     vector<int> print;
  97.     print.push_back(ans);
  98.     /*for (int i=0; i<n; ++i){
  99.         cout << comp[i] << " ";
  100.     }*/
  101.     for (int i=1; i<=k; ++i){
  102.         make_set(i);
  103.     }
  104.         for (int i = q - 1; i > 0; --i) {
  105.             if (union_sets(comp[edges[rep[i]].f], comp[edges[rep[i]].s])) {
  106.                 ans = max(1, --ans);
  107.                 print.emplace_back(ans);
  108.             }
  109.             else{
  110.                 print.emplace_back(ans);
  111.             }
  112.         }
  113.     int size=print.size()-1;
  114.     for (int i=size; i>=0; --i){
  115.         cout << print[i] << " ";
  116.     }
  117.  
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement