【xdoj离散数学上机】T283

发布于:2025-02-14 ⋅ 阅读:(109) ⋅ 点赞:(0)

递归函数易错:

防止出现递归死循环!

题目

 题目:求诱导出的等价关系的关系矩阵

问题描述

给定有限集合上二元关系的关系矩阵,求由其诱导出的等价关系的关系矩阵。

输入格式

第一行输入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;
}


网站公告

今日签到

点亮在社区的每一天
去签到