用二进制和并差集解决:
并查集通用代码
int father[N];
int visited[N];
int find(int n) {
if(father[n]==n)
return n;
father[n]=find(father[n]);
return father[n];
}
void merge(int x,int y){
int x_father = find(x);
int y_father = find(y);
if(x_father != y_father)
father[x_father] = y_father;
}
此题中,并查集的对象为边,而非定点
#include <bits/stdc++.h>
using namespace std;
int father[7];
int visited[7];
int find(int n) {
if(father[n]==n)
return n;
father[n]=find(father[n]);
return father[n];
}
void merge(int x,int y){
int x_father = find(x);
int y_father = find(y);
if(x_father != y_father)
father[x_father] = y_father;
}
int main(){
int ret = 0;
for(int i = 1;i < (1 << 7);i++){
bitset<7> b(i); //转换为二进制
for (int k = 0; k < 7; ++k) father[k] = k;
memset(visited, 0, sizeof visited);
for(int j = 0;j < 7;j++){
if(b[j]){
visited[j] = 1;
if(j == 0){
if(visited[1]) merge(0,1);
if(visited[5]) merge(0,5);
}else if(j == 1){
if(visited[0]) merge(1,0);
if(visited[2]) merge(1,2);
if(visited[6]) merge(1,6);
}else if(j == 2){
if(visited[1]) merge(2,1);
if(visited[3]) merge(2,3);
if(visited[6]) merge(2,6);
}else if(j == 3){
if(visited[2]) merge(3,2);
if(visited[4]) merge(3,4);
}else if(j == 4){
if(visited[3]) merge(4,3);
if(visited[5]) merge(4,5);
if(visited[6]) merge(4,6);
}else if(j == 5){
if(visited[0]) merge(5,0);
if(visited[4]) merge(5,4);
if(visited[6]) merge(5,6);
}else if(j == 6){
if(visited[1]) merge(6,1);
if(visited[2]) merge(6,2);
if(visited[4]) merge(6,4);
if(visited[5]) merge(6,5);
}
}
}
int cnt = 0;
for(int k = 0;k < 7;k++){
if(visited[k] && father[k] == k)
cnt++;
}
//连同分量只有一个
if(cnt == 1)
ret++;
}
cout << ret;
}