P1197 [JSOI2008]星球大战
Posted thjkhdf12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1197 [JSOI2008]星球大战相关的知识,希望对你有一定的参考价值。
1 #include<iostream> 2 #include<cstring> 3 #define debug(i) cout<<"(i): "<<i<<endl 4 using namespace std; 5 6 int fa[400010]; 7 8 int find(int x) 9 { 10 if (fa[x] == x) return x; 11 fa[x] = find(fa[x]); 12 return fa[x]; 13 } 14 15 void merge(int a, int b) 16 { 17 fa[find(a)] = find(b); 18 } 19 20 bool check(int a, int b) 21 { 22 return find(a) == find(b); 23 } 24 25 int n, m; 26 int k; 27 int ans[400010]; 28 int head[400010]; 29 int cnt; 30 int be; 31 32 struct Edge 33 { 34 int u, v, nxt; 35 }e[400010]; 36 37 int b[400010]; 38 bool des[400010]; 39 40 void add(int a, int b) 41 { 42 e[cnt].u = a; 43 e[cnt].nxt = head[a]; 44 head[a] = cnt; 45 e[cnt++].v = b; 46 } 47 48 int main() 49 { 50 cin >> n >> m; 51 for (int i = 0; i < n; i++) 52 { 53 fa[i] = i; 54 head[i] = -1; 55 } 56 for (int i = 0; i < m; i++) 57 { 58 int a, b; 59 cin >> a >> b; 60 add(a, b); 61 add(b, a); 62 } 63 cin >> k; 64 be = n - k; 65 for (int i = 0; i < k; i++) 66 { 67 //debug(i); 68 cin >> b[i]; 69 des[b[i]] = true; 70 } 71 //cout << endl; 72 for (int i = 0; i < cnt; i++) 73 { 74 if (!des[e[i].u] && !des[e[i].v]&&!check(e[i].u,e[i].v)) 75 { 76 //debug(be); 77 be--; 78 merge(e[i].u, e[i].v); 79 } 80 } 81 ans[k] = be; 82 for (int i = k - 1; i >= 0; i--) 83 { 84 int t = b[i]; 85 be++; 86 des[t] = false; 87 for (int j = head[t]; j != -1; j = e[j].nxt) 88 { 89 if (!des[e[j].v] && !check(t, e[j].v)) 90 { 91 be--; 92 merge(t, e[j].v); 93 } 94 } 95 ans[i] = be; 96 } 97 //cout << endl; 98 for (int i = 0; i <= k; i++) 99 { 100 cout << ans[i] << endl; 101 } 102 return 0; 103 }
以上是关于P1197 [JSOI2008]星球大战的主要内容,如果未能解决你的问题,请参考以下文章