随机算法瞎练BZOJ3237&3563&3569三倍经验题

(*^▽^*)判断无向图联通

 1 #include <bits/stdc++.h>
2 using namespace std;
3 int n,m,p,q,E,Q;
4 struct edge
5 {
6     int from,to;
7 } e[1000001];
8 struct bas
9 {
10     int a[32];
11     bool over;
12     bas()
13     {
14         for(int i=0;i<=31;i++)
15             a[i]=0;
16         over=0;
17     }
19     {
20         if(over) return;
21         for(int i=31;i>=0;i--)
22         if(x>>i)
23         if(a[i]) x^=a[i];
24         else
25         {
26             a[i]=x;
27             return;
28         }
29         over=1;
30     }
31 } ret;
32 int w[1000001],wei[1000001],fa[1000001];
33 int nex[1000001],fir[1000001];
34 bool vis[1000001];
35 void build(int now,int fat)
36 {
37     fa[now]=fat;vis[now]=1;
38     for(int i=fir[now];i;i=nex[i])
39     if(!vis[e[i].to])
40         build(e[i].to,now);
41 }
42 int dfs(int now)
43 {
44     for(int i=fir[now];i;i=nex[i])
45     if(fa[e[i].to]==now)
46         w[now]^=dfs(e[i].to);
47     return w[now];
48 }
50 {
51     e[++E].from=x;e[E].to=y;nex[E]=fir[x];fir[x]=E;
52     e[++E].from=y;e[E].to=x;nex[E]=fir[y];fir[y]=E;
53 }
54 int main()
55 {
56     scanf("%d%d",&n,&m);
57     for(int i=1;i<=m;i++)
59     build(1,0);
60     srand(2333);
61     for(int i=1;i<=E;i+=2)
62     if(fa[e[i].from]!=e[i].to && fa[e[i].to]!=e[i].from)
63     {
64         wei[i]=rand()*32768+rand();
65         w[e[i].from]^=wei[i];
66         w[e[i].to]^=wei[i];
67     }
68     dfs(1);
69
70     for(int i=1;i<=E;i+=2)
71     if(fa[e[i].from]==e[i].to)
72         wei[i]=w[e[i].from];
73     else
74     if(fa[e[i].to]==e[i].from)
75         wei[i]=w[e[i].to];
76
77     scanf("%d",&Q);
78     int key=0;
79     for(int i=1;i<=Q;i++)
80     {
81         if(i==5)
82             int e=1;
83         scanf("%d",&p);
84     //    p^=key;
85         ret=bas();
86         for(int j=1;j<=p;j++)
87             scanf("%d",&q),q^=key,
93  }