[codevs1995]黑魔法师之门

来源:互联网 发布:淘宝韩式褶皱斑马帘 编辑:程序博客网 时间:2024/06/09 21:23

题目←

容易发现题目描述的子图仅能包含强连通分量

什么时候出现强连通分量呢?在两个点已经连通后又加了条边的时候,子图数 = 原子图数*2 + 1

新增方案数为原子图数 + 1,意义为

1、用新添的边替换两点间一条原边产生的新方案

2、新添的边产生的新强连通分量

#include<iostream>#include<cstdio>#include<algorithm>#define mod 1000000009using namespace std;long long ans;const int MAXN = 400000 + 50;int fa[MAXN];void init(int n){    for(int i = 1;i <= n;i ++)        fa[i] = i;}int find(int x){    return fa[x] == x ? x : fa[x] = find(fa[x]);}int n,m,a,b;bool same(int a,int b){    return find(a) == find(b);}void merge(int a,int b){    a = find(a);    b = find(b);    fa[b] = a;}int main(){    scanf("%d%d",&n,&m);    init(n);    for(int i = 1;i <= m;i ++)    {        scanf("%d%d",&a,&b);        if(!same(a,b))merge(a,b);        else ans = ((ans*2)%mod + 1)%mod;        printf("%lld\n",ans);    }}

代码贼简单……