黑魔法师之门(并查集)

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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值