set去重
#include <bits/stdc++.h>
using namespace std;
const int N=8;
int g[8][8];
int fa[8];
int res=0;
set<set<int> >Se;
int find(int x){
if(fa[x]==x)return x;
else return fa[x]=find(fa[x]);
}
void init(){
g[0][1]=1;
g[0][5]=1;
g[1][2]=1;
g[1][6]=1;
g[2][3]=1;
g[2][6]=1;
g[3][4]=1;
g[4][5]=1;
g[4][6]=1;
g[5][6]=1;
g[1][0]=1;
g[5][0]=1;
g[2][1]=1;
g[6][1]=1;
g[3][2]=1;
g[6][2]=1;
g[4][3]=1;
g[5][4]=1;
g[6][4]=1;
g[6][5]=1;
}
void dfs(int x,set<int> s){
if(x>=7){
for(int i=0;i<7;i++){
fa[i]=i;
}
for(int i=0;i<7;i++){
for(int j=0;j<7;j++){
if(g[i][j]&&s.count(i)&&s.count(j)){
int fi=find(i);
int fj=find(j);
if(fi!=fj)fa[fi]=fj;
}
}
}
int cnt=0;
for(int i=0;i<7;i++){
if(s.count(i)&&find(i)==i)cnt++;
}
if(cnt==1&&Se.count(s)==0){
res++;
Se.insert(s);
}
return ;
}
s.insert(x);
dfs(x+1,s);
s.erase(x);
dfs(x+1,s);
}
int main() {
init();
set<int> s;
s.clear();
dfs(0,s);
cout<<res;
return 0;
}
二进制去重(有点像bitset)
来自这里
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int use[N],ans,e[N][N],fa[N],flag[1000];
void init() {
e[1][2]=e[1][6]=1;
e[2][1]=e[2][7]=e[2][3]=1;
e[3][2]=e[3][4]=e[3][7]=1;
e[4][3]=e[4][5]=1;
e[5][4]=e[5][6]=e[5][7]=1;
e[6][1]=e[6][5]=e[6][7]=1;
}
int find(int u){if(fa[u]==u)return u;fa[u]=find(fa[u]);return fa[u]
void dfs(int d,int sum){
if(d>7){
for(int i=1;i<=7;i++)fa[i]=i;
for(int i=1;i<=7;i++)
for(int j=1;j<=7;j++)
if(e[i][j]&&use[i]&&use[j]){
int fx=find(i),fy=find(j);
if(fx!=fy){
fa[fx]=fy;
}
}
int k=0;
for(int i=1;i<=7;i++)if(use[i]&&fa[i]==i)k++;
if(k==1&&!flag[sum]){
flag[sum]=1;
ans++;
}
return;
}
use[d]=1;
dfs(d+1,sum+(1<<d));
use[d]=0;
dfs(d+1,sum);
}
int main(){
init();
dfs(1,0);
cout<<ans;
}