Codevs1995 黑魔法师之门
hzw:并查集维护,如果两点,在同一集合中 ans*2+1
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
#define MAXN (300020)
#define mod (1000000009)
int first[MAXN], nxt[MAXN<<1], fa[MAXN];
struct edge{
int from, to, cost;
}es[MAXN << 1];
int find(int x)
{
int r = x;
while(r != fa[r])
r = fa[r];
int t;
while(x != r)
{
t = fa[x];
fa[x] = r;
x = t;
}
return r;
}
void read(int &a)
{
a = 0; bool f = 0;
char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-') f = 1;
ch = getchar();
}
while(isdigit(ch))
{
a *= 10;
a += (ch-'0');
ch = getchar();
}
if(f) a *= -1;
}
int main()
{
int n, m, ans = 0;
read(n);read(m);
for(int i = 1; i <= n; ++ i) fa[i] = i;
while(m--)
{
int a, b;
read(a);read(b);
int ya = find(a), yb = find(b);
if(ya != yb) fa[ya] = yb;
else ans = (((ans%mod)*2)%mod+1)%mod;
printf("%d\n", ans);
}
return 0;
}