
深搜遍历所有组合,并查集判断组合是否相连。
#include <bits/stdc++.h>
using namespace std;
int mp[7][7]={
1, 1, 0, 0, 0, 1, 0,
1, 1, 1, 0, 0, 0, 1,
0, 1, 1, 1, 0, 0, 1,
0, 0, 1, 1, 1, 0, 0,
0, 0, 0, 1, 1, 1, 1,
1, 0, 0, 0, 1, 1, 1,
0, 1, 1, 0, 1, 1, 1,
};
int f[7];
int vis[7] = {0};
int find(int x) {
while (f[x]!=x) {
x = f[x];
}
return x;
}
void join(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx != fy){
f[fx] = fy;
}
}
int res = 0;
void dfs(int pos){
if(pos == 7){
for(int i = 0; i < 7; i++){
f[i] = i;
}
for(int i = 0; i < 7; i++){
for(int j = i + 1; j < 7; j++){
if(mp[i][j] && vis[i] && vis[j]){
join(i, j);
}
}
}
int cnt = 0;
for(int i = 0; i < 7; i++){
if(vis[i] && f[i] == i) cnt++;
}
//只存在一个集合,则说明标记的位置相连
if(cnt == 1) res++;
return;
}
vis[pos] = 1;
dfs(pos + 1);
vis[pos] = 0;
dfs(pos + 1);
}
int main(){
dfs(0);
cout<<res<<endl;
return 0;
}
该代码实现了一个C++程序,通过深度优先搜索(DFS)遍历所有可能的组合,并利用并查集(Union-Find)来判断这些组合是否在给定的矩阵中相连。当只存在一个集合时,说明标记的位置是相连的。
1679

被折叠的 条评论
为什么被折叠?



