Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N=1e5;
- int parent[N];
- int ranked[N];
- void make_set(int v){
- parent[v]=v;
- ranked[v]=0;
- }
- int find_set(int v){
- if (v==parent[v]){
- return v;
- }
- return parent[v]=find_set(parent[v]);
- }
- bool union_sets (int a, int b){
- a=find_set(a);
- b=find_set(b);
- if (a!=b){
- if (ranked[a]<ranked[b]){
- swap(a,b);
- }
- parent[b]=a;
- if (ranked[a]==ranked[b]){
- ++ranked[a];
- }
- return true;
- }
- else{
- return false;
- }
- }
- struct edge {
- int f,s;
- bool b;
- };
- int n,m,q;
- vector<edge> edges;
- vector<int> rep;
- vector<int> graph[N];
- int comp [N];
- void dfs (int v, int t) {
- comp[v]=t;
- for (auto to : graph[v]){
- if (!comp[to]){
- dfs(to,t);
- }
- }
- }
- int main (){
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- cin >> n >> m;
- for (int i=0; i<m; ++i){
- edge tmp{};
- int x,y; cin >> x >> y;
- x--;
- y--;
- tmp.f=x;
- tmp.s=y;
- tmp.b=true;
- edges.emplace_back(tmp);
- }
- cin >> q;
- for (int i=0; i<q; ++i){
- int k; cin >> k;
- k--;
- edges[k].b=false;
- rep.emplace_back(k);
- }
- for (auto elem : edges){
- if (elem.b){
- graph[elem.f].emplace_back(elem.s);
- graph[elem.s].emplace_back(elem.f);
- }
- }
- int k=1;
- for (int i=0; i<n; ++i){
- if (!comp[i]){
- dfs(i,k);
- k++;
- }
- }
- int ans=k-1;
- vector<int> print;
- print.push_back(ans);
- /*for (int i=0; i<n; ++i){
- cout << comp[i] << " ";
- }*/
- for (int i=1; i<=k; ++i){
- make_set(i);
- }
- for (int i = q - 1; i > 0; --i) {
- if (union_sets(comp[edges[rep[i]].f], comp[edges[rep[i]].s])) {
- ans = max(1, --ans);
- print.emplace_back(ans);
- }
- else{
- print.emplace_back(ans);
- }
- }
- int size=print.size()-1;
- for (int i=size; i>=0; --i){
- cout << print[i] << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement