码迷,mamicode.com
首页 > Web开发 > 详细

P1197-[JSOI2008]星球大战

时间:2019-09-19 22:00:13      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:typedef   ase   read   div   clu   insert   names   bsp   ++   

  1 #include <bits/stdc++.h>
  2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
  3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
  4 #define INF 0x3f3f3f3f
  5 #define MOD 1000000007
  6 #define pb push_back
  7 typedef long long ll;
  8 using namespace std;
  9 inline ll read()
 10 {
 11     ll ans = 0;
 12     char ch = getchar(), last =  ;
 13     while(!isdigit(ch)) last = ch, ch = getchar();
 14     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - 0, ch = getchar();
 15     if(last == -) ans = -ans;
 16     return ans;
 17 }
 18 inline void write(ll x)
 19 {
 20     if(x < 0) x = -x, putchar(-);
 21     if(x >= 10) write(x / 10);
 22     putchar(x % 10 + 0);
 23 }
 24 
 25 const int maxn = 400033;
 26 int par[maxn]; 
 27 int high[maxn]; 
 28 int cnt = 0;
 29 void init(int n)
 30 {
 31     _for(i,0,n)
 32     {
 33         par[i] = i;
 34         high[i] = 0;
 35     }
 36 } 
 37 
 38 int find(int x)
 39 {
 40     return par[x] == x ? x : par[x] = find(par[x]);
 41 }
 42 
 43 void unite(int x,int y)
 44 {
 45     x = find(x);y = find(y);
 46     if(x==y) return ;
 47     cnt --;
 48     if(high[x]<high[y])
 49         par[x] = y;
 50     else
 51     {
 52         par[y] = x;
 53         if(high[x]==high[y])
 54             high[x] ++;
 55     }
 56 }
 57 
 58 bool same(int x,int y)
 59 {
 60     return find(x) == find(y);
 61 }
 62 int N,M,K; 
 63 vector<int> G[400003];
 64 vector<int> v;
 65 set<int> ts;
 66 vector<int> ans;
 67 int main()
 68 {
 69     N = read(),M = read();
 70     init(N);
 71     int a,b;
 72     _for(i,0,M)
 73     {
 74         a = read(),b = read();
 75         G[a].pb(b);
 76         G[b].pb(a);
 77     }
 78     K = read();
 79     _for(i,0,K)
 80     {
 81         int t = read();
 82         v.pb(t);
 83         ts.insert(t);
 84     }
 85     
 86     _for(i,0,N)
 87         if(!ts.count(i))
 88         {
 89             cnt ++;
 90             _for(j,0,G[i].size())
 91                 if(!ts.count(G[i][j]))
 92                     unite(i,G[i][j]);
 93         }
 94     ans.pb(cnt);
 95     _rep(i,v.size()-1,-1)
 96     {
 97         cnt ++;
 98         _for(j,0,G[v[i]].size())
 99             if(!ts.count(G[v[i]][j]))
100                 unite(v[i],G[v[i]][j]);
101         ans.pb(cnt);
102         auto p = ts.find(v[i]);
103         ts.erase(p);
104     }
105     _rep(i,ans.size()-1,-1)
106         printf("%d\n",ans[i]);
107     return 0;
108 }

 

P1197-[JSOI2008]星球大战

标签:typedef   ase   read   div   clu   insert   names   bsp   ++   

原文地址:https://www.cnblogs.com/Asurudo/p/11552372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!