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

如此繁琐、混沌、模糊、抽象、反人类的定义,大家看了之后估计要打死我呀器qiu🤦♂️
简单的解释一下
- 最小元:比任何元素都大的元素(其中有个奥妙就是最小元能与集合中的任何元素进行比较并且比他们都小)
- 最大元:略。。。。略略略
- 极小元:没有比它更小的元素(没有比它小不代表它比任何元素都小,因为可能存在无法与极小元进行比较的元素,既然有些元素没有办法进行比较,那自然是”没有比它更小“)
- 极大元:同略
分析
对于偏序关系的偏序矩阵而言,通过分析,得出一下结论 - 主对角线全为1
- 除主对角线上的数字外,如果第 i 行全为0,那么第 i 个元素为极大元
- 除主对角线上的数字外,如果第 i 行全是1,那么第 i 个元素为最小元
- 除主对角线上的数字外,如果第 i 列全为0,那么第 i 个元素为极小元
- 除主对角线上的数字外,如果第 i 列全为1,那么第 i 个元素为最大元
一波分析之后问题就有了头绪了,接下来就是用程序来进行操作了
程序 c++
#include
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
运行结果

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
