applepi被囚禁的地点只有一扇门,当地人称它为“黑魔法师之门”。这扇门上画着一张无向无权图,而打开这扇门的密码就是图中【每个点的度数大于零且都是偶数】的子图的个数对1000000009取模的值。此处子图 (V, E) 定义为:点集V和边集E都是原图的任意子集,其中E中的边的端点都在V中。
但是Vani认为这样的密码过于简单,因此门上的图是动态的。起初图中只有N个顶点而没有边。Vani建造的门控系统共操作M次,每次往图中添加一条边。你必须在每次操作后都填写正确的密码,才能够打开黑魔法师的牢狱,去拯救伟大的领袖applepi。
要想得到题目中的要求的子图(要求图中每个点都有偶数且不等于0的度),那个这个子图必定是有若干个环构成的。我们假设一个图有X个环,那么题目的答案就变成了每个环选或不选的方案数,由于不能有都不选的情况。所以ANS=2^x-1
接下来就是要求出图中环的个数了,这道题显然不适合用tarjan环,时间复杂度会变成(NM)。 我们考虑用并查集,每当我们加入一条边,如果这条边的两个端点已经在同一个连通块内(祖宗相同),那么必定会多出一个环,若不在,这将他们所在的联通块合并。
const p=1000000009;
var
fa:array[0..200000] of longint;
n,a,b,ans,m,i:longint;
function find(x:longint):longint;
begin
if fa[x]=x then exit(x);
fa[x]:=find(fa[x]);
exit(fa[x]);
end;
begin
readln(n,m); ans:=1;
for i:=1 to n do fa[i]:=i;
for i:=1 to m do
begin
readln(a,b);
a:=find(a);
b:=find(b);
if a=b then ans:=ans*2 mod p
else fa[a]:=b;
writeln(ans-1);
end;
end.