并查集裸题。
按照星球毁灭顺序从后向前插点,并向可行点连边。插入一个点联通块+1;连接一条边联通块-1。
PS刷水题有益于健康
/**************************************************************
Problem: 1015
User: zhouyuyang
Language: Pascal
Result: Accepted
Time:2884 ms
Memory:16036 kb
****************************************************************/
uses math;
var
a,b,c,d,e,f,g,h:array [0..500005] of longint;
n,m,k,i,p,x,y,pa:longint;
function get(x:longint):longint;
begin
if (x=f[x]) then exit(x);
f[x]:=get(f[x]);
exit(f[x]);
end;
begin
read(n,m);
for i:=1 to m do read(a[i],b[i]);
for i:=1 to m do begin a[i+m]:=b[i]; b[i+m]:=a[i]; end;
m:=m*2;
for i:=1 to m do
begin
c[i]:=d[a[i]];
d[a[i]]:=i;
end;
read(k);
for i:=1 to k do read(e[i]);
for i:=0 to n do f[i]:=i;
for i:=1 to k do g[e[i]]:=1;
pa:=n-k;
for i:=1 to n do
if (g[i]=0) then begin
p:=d[i];
while (p<>0) do begin
x:=get(a[p]); y:=get(b[p]);
if (x<>y) and (g[b[p]]=0) then begin dec(pa); f[x]:=y; end;
p:=c[p];
end;
end;
for i:=k downto 1 do begin
h[i]:=pa; inc(pa); g[e[i]]:=0; p:=d[e[i]];
while (p<>0) do begin
x:=get(a[p]); y:=get(b[p]);
if (x<>y) and (g[b[p]]=0) then begin dec(pa); f[x]:=y; end;
p:=c[p];
end;
end;
writeln(pa);
for i:=1 to k do writeln(h[i]);
end.