离散数学-求偏序关系的最大小元,极大小元

序:

前段时间,自信的以为离散数学就要挂科之时,离散数学程序设计实验课从天而降。正所谓富贵险中求,为了不挂科,赌一把(要么两个科目都过,要么两个科目都挂掉)。
一位可怜的室友被我拉下了水之后,事情就变得非常有趣了( ﹁ ﹁ ) ~→

正文

定义
在这里插入图片描述
如此繁琐、混沌、模糊、抽象、反人类的定义,大家看了之后估计要打死我呀器qiu🤦‍♂️
简单的解释一下

  • 最小元:比任何元素都大的元素(其中有个奥妙就是最小元能与集合中的任何元素进行比较并且比他们都小)
  • 最大元:略。。。。略略略
  • 极小元:没有比它更小的元素(没有比它小不代表它比任何元素都小,因为可能存在无法与极小元进行比较的元素,既然有些元素没有办法进行比较,那自然是”没有比它更小“)
  • 极大元:同略
    分析
    对于偏序关系的偏序矩阵而言,通过分析,得出一下结论
  • 主对角线全为1
  • 除主对角线上的数字外,如果第 i 行全为0,那么第 i 个元素为极大元
  • 除主对角线上的数字外,如果第 i 行全是1,那么第 i 个元素为最小元
  • 除主对角线上的数字外,如果第 i 列全为0,那么第 i 个元素为极小元
  • 除主对角线上的数字外,如果第 i 列全为1,那么第 i 个元素为最大元
    一波分析之后问题就有了头绪了,接下来就是用程序来进行操作了

程序 c++

#include<iostream>
using namespace std;
class Partiality {
public:
	Partiality()		//定义构造函数
	{
		len = 0;
		memset(m, 0, sizeof(m));
	}
	void input()	//定义用于数据输出的函数
	{
		cout << "请输入集合中元素个数" << endl;
		cin >> len;							//输入元素个数
		bool temp;
		cout << "请输入关系矩阵" << endl;
		for (int i = 0; i < len; i++)		//输入关系矩阵
			for (int j = 0; j < len; j++)
				cin >> m[i][j];
	}
	void print_matrix()//输出关系矩阵
	{
		cout << "关系矩阵:" << endl;
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len; j++) {
				cout << m[i][j] << " ";
			}
			cout << endl;
		}
	}
	
	bool is_jida(int num)		//判断极大元
	{
		//行 0,如果在行上,处本身外全为零,则它是极大元
		bool ans = 1;
		for (int i = 0; i < len; i++)
		{
			if (i != num)
			{
				if (m[num][i])
				{
					ans = 0;
					break;
				}
			}
		}
		return ans;
	}
	bool is_zuida(int num)		//判断最大元
	{
		//如果列上全是1,那么它是最大元
		bool ans = 1;
		for (int i = 0; i < len; i++)
		{
			if (!m[i][num])
			{
				ans = 0;
				break;
			}
		}
		return ans;
	}
	bool is_jixiao(int num)		//判断极小元
	{
		//如果列上除本身外,其它值全部是0,那么他是极小元
		bool ans = 1;
		for (int i = 0; i < len; i++)
		{
			if (i != num)
			{
				if (m[i][num])
				{
					ans = 0;
					break;
				}
			}
		}
		return ans;
	}
	bool is_zuixiao(int num)	//判断最小元
	{
		//如果行上全是1,那么它是最小元
		bool ans = 1;
		for (int i = 0; i < len; i++)
		{
			if (!m[num][i])
			{
				ans = 0;
				break;
			}
		}
		return ans;
	}
	
	void print_jida()	//输出极大元
	{
		int sum = 0;
		cout << "极大元:";
		for (int i = 0; i < len; i++)
		{
			if (is_jida(i))
			{
				cout << i << " ";
				sum++;
			}
		}
		if (!sum)
			cout << "无";
		cout << endl;
	}
	void print_zuida()	//输出最大元
	{
		int sum = 0;
		cout << "最大元:";
		for (int i = 0; i < len; i++)
		{
			if (is_zuida(i))
			{
				cout << i << " ";
				sum++;
			}
		}
		if (!sum)
			cout << "无";
		cout << endl;
	}
	void print_jixiao()	//输出极小元
	{
		int sum = 0;
		cout << "极小元:";
		for (int i = 0; i < len; i++)
		{
			if (is_jixiao(i))
			{
				cout << i << " ";
				sum++;
			}
		}
		if (!sum)
			cout << "无";
		cout << endl;
	}
	void print_zuixiao()//输出最小元
	{
		int sum = 0;
		cout << "最小元:";
		for (int i = 0; i < len; i++)
		{
			if (is_zuixiao(i))
			{
				cout << i << " ";
				sum++;
			}
		}
		if (!sum)
			cout << "无";
		cout << endl;
	}
	bool  m[128][128];
	int len;
};
int main()
{
	Partiality p;
	p.input();
	p.print_jida();
	p.print_jixiao();
	p.print_zuida();
	p.print_zuixiao();
	return 0;
}

数据验证

输入数据

6
1 1 1 0 1 1
0 1 0 0 0 1
0 0 1 0 1 0
0 0 0 1 0 1
0 0 0 0 1 1
0 0 0 0 0 1

运行结果
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值