rt,玄 3 关求调
#include<bits/stdc++.h>
using namespace std;
int n,m,totans;
int x[1000007],y[1000007];
int father[500006];
void Reset(){
for(int i=1;i<=n;i++)father[i]=i;
return;
}
int Find(int u){
if(father[u]==u)return u;
else return father[u]=Find(father[u]);
}
void Union(int u,int v){
u=Find(u);
v=Find(v);
if(u==v)return;
father[v]=u;
return;
}
vector<int>vc,vceg;
void chk(){
Reset();
int tmp=vc.size();
for(auto i:vceg)Union(x[i],y[i]);
int r=Find(vc[0]);
for(auto i:vc)if(Find(i)!=r)return;
for(auto i:vc)cerr<<i<<" ";
cerr<<"|";
for(auto i:vceg)cerr<<" "<<i;
cerr<<"\n";
totans++;
totans%=1000000007;
return;
}
void search2(int u){
if(u>m){
chk();
return;
}
search2(u+1);
vceg.push_back(u);
search2(u+1);
vceg.pop_back();
return;
}
void search(int u){
if(u>n){
if(vc.empty())return;
search2(1);
return;
}
search(u+1);
vc.push_back(u);
search(u+1);
vc.pop_back();
return;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d %d",&x[i],&y[i]);
search(1);
printf("%d",totans);
return 0;
}