bzoj 1015
parent
14ff9bb44f
commit
864f89628c
@ -0,0 +1,52 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include <cctype>
|
||||||
|
const int maxn = 500010;
|
||||||
|
int fa[maxn], to[maxn], next[maxn], head[maxn], ecnt, destroy[maxn], ans, st[maxn], s_top;
|
||||||
|
bool destroyed[maxn];
|
||||||
|
inline void readInt(int &x)
|
||||||
|
{
|
||||||
|
int ch = x = 0;
|
||||||
|
while (!isdigit(ch = getchar()));
|
||||||
|
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
|
||||||
|
}
|
||||||
|
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
|
||||||
|
void link(int x, int y)
|
||||||
|
{
|
||||||
|
int fx = find(x), fy = find(y);
|
||||||
|
if (fx != fy) fa[fx] = fy, ans--;
|
||||||
|
}
|
||||||
|
inline void addEdge(int x, int y)
|
||||||
|
{
|
||||||
|
ecnt++;
|
||||||
|
to[ecnt] = y;
|
||||||
|
next[ecnt] = head[x];
|
||||||
|
head[x] = ecnt;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < maxn; i++) fa[i] = i;
|
||||||
|
int n, m, k;
|
||||||
|
readInt(n), readInt(m);
|
||||||
|
for (int i = 0, x, y; i < m; i++)
|
||||||
|
readInt(x), readInt(y),
|
||||||
|
addEdge(x, y), addEdge(y, x);
|
||||||
|
readInt(k);
|
||||||
|
for (int i = 0; i < k; i++)
|
||||||
|
readInt(destroy[i]), destroyed[destroy[i]] = true;
|
||||||
|
ans = n - k;
|
||||||
|
for (int i = 0; i < n; i++) if (!destroyed[i])
|
||||||
|
for (int cur = head[i]; cur; cur = next[cur]) if (!destroyed[to[cur]])
|
||||||
|
link(i, to[cur]);
|
||||||
|
st[s_top++] = ans;
|
||||||
|
for (int i = k - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
int x = destroy[i];
|
||||||
|
destroyed[x] = false;
|
||||||
|
ans++;
|
||||||
|
for (int cur = head[x]; cur; cur = next[cur]) if (!destroyed[to[cur]])
|
||||||
|
link(x, to[cur]);
|
||||||
|
st[s_top++] = ans;
|
||||||
|
}
|
||||||
|
while (s_top) printf("%d\n", st[--s_top]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in new issue