递归函数易错:
防止出现递归死循环!
题目
题目:求诱导出的等价关系的关系矩阵
问题描述
给定有限集合上二元关系的关系矩阵,求由其诱导出的等价关系的关系矩阵。
输入格式
第一行输入n,表示矩阵为n阶方阵,第二行给出关系矩阵
输出格式
诱导出的等价关系的关系矩阵
样例输入
样例1;
3
1 0 0
0 0 0
0 0 1
样例2:
3
1 1 1
0 0 0
0 0 1
样例输出
样例1;
1 0 0
0 1 0
0 0 1
样例2:
1 1 1
1 1 1
1 1 1
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n; cin>>n;
vector<vector<int>>graph(n, vector<int>(n, 0));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
//对称性
int cur = graph[i][j];
if(cur == 1) cin>>cur;
else cin>>graph[i][j];
if(graph[i][j] == 1)
{
graph[j][i] = 1;
}
//自反性
if(i == j) graph[i][j] = 1;
}
}
//传递性
set<int>st;
auto dfs = [&](auto& dfs, int fa, int cur) -> void
{
for(int i=0; i<n; i++)
{
if(cur != i && graph[cur][i] == 1)
{
if(!st.count(i))//防止在两个关联项之间死循环递归
{
graph[fa][i] = 1;
graph[i][fa] = 1;
st.insert(i);
dfs(dfs, fa, i);
}
}
}
return;
};
//调用递归时间
for(int i=0; i<n; i++)
{
st.insert(i);
dfs(dfs, i, i);
st.clear();
}
//输出
for(int i=0; i<n; i++)
{
for(int j = 0; j < n; j++)
{
cout<<graph[i][j]<<" ";
}
cout<<endl;
}
return 0;
}