二进制+并查集
###思路:将每条边存到pair类型的vector中,使用位运算枚举所有边的选择情况,如果某条边被选中,就将边的两个端点置为被访问过,并加到一个集合中,处理完所有边后,
看所有被访问过的点是否都在同一个集合
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N=10;
int f[N][N];
vector<PII>q;
bool st[N];
int p[N];
void init()
{
q.push_back({1,2});
q.push_back({1,3});
q.push_back({2,4});
q.push_back({3,4});
q.push_back({3,5});
q.push_back({4,6});
q.push_back({5,6});
}
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main()
{
init();
int res=0;
for(int i=1;i<(1<<7);i++)
{
memset(st, 0, sizeof st);
for(int z=1;z<=6;z++) p[z]=z;
int x=0;
for(int j=0;j<7;j++)
{
if(i>>j&1)
{
//cout<<"j:"<<j<<endl;
int a=q[j].first,b=q[j].second;
st[a]=1,st[b]=1;
int pa=find(a),pb=find(b);
p[pa]=pb;
x=a;
}
}
int flag=1;
int f=1;
int pa=find(x);
for(int j=1;j<=6;j++)
{
if(st[j])
{
if(find(j)!=pa)
flag=0;
}
}
if(flag) res++;
}
cout<<res<<endl;
return 0;
}