您的位置:首页 > 其它

Codevs1995 黑魔法师之门 并查集

2016-11-13 10:55 302 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: