【离散数学实验】相容关系的极大相容类的计算
来源:互联网 发布:非mac安装os x 编辑:程序博客网 时间:2024/05/06 10:49
相容关系的极大相容类的计算.cpp
运行环境VisualStudio2013及以上版本
//=============================================================================// 离散数学实验(3)_相容关系的极大相容类的计算// 2015/11/09 ZkP//=============================================================================#include<iostream>#include<vector>#include<sstream>//基于字符串的流#include <stdlib.h> using namespace std;//=============================================================================void InputA(vector<int> &A,int &num){ cout << "请输入集合A的元素个数num:" << endl; cin >> num; cout << "请输入集合A的元素:" << endl; for (int i = 0; i < num; i++) A.push_back(getchar());}void Inputmat(vector<vector<int>> &mat,int num){ cout << "请输入关系矩阵:" << endl; for (int i = 0; i < num; i++) for (int j = 0; j < num; j++) { vector<int>temp(1); cin >> temp[0]; mat.push_back(temp); }}//Inputmat//=============================================================================void DeleteRepeat(vector<vector < int > > &mat)//删除集类中的重复元素{ int i, j, k, l, m, n, o; for (i = 0; i < mat.size(); i++) { for (j = 0; j < mat[i].size(); j++) { for (k = 0; k < mat.size(); k++) { for (l = 0; l < mat[k].size(); l++) { if (i >= mat.size() || k >= mat.size()) break; if (i != k&&mat[i][j] == mat[k][l]) { vector<int> v1(10), v2(10); v1 = mat[i]; v2 = mat[k]; int count = 0; for (m = 0; m < v1.size(); m++) for (n = 0; n < v2.size(); n++) if (v1[m] == v2[n]) { count++; break; } if (count == v1.size())//若v2是v1的子集 { for (o = i; o < mat.size() - 1; o++) mat[o] = mat[o + 1]; mat.pop_back(); } else if (count == v2.size())//若v1是v2的子集 { for (o = k; o < mat.size() - 1; o++) mat[o] = mat[o + 1]; mat.pop_back(); } } if (k >= mat.size()) break; } } if (i >= mat.size()) break; } }}//DeleteRepeat//=============================================================================void MaximalCompatibleClass(vector<int> A, vector<vector<int>> mat)//求相容类的极大相容类{ vector< vector< int>> mat1; int size_A = A.size(); int i, j, k, m; for (i = 0; i < size_A; i++)//①; { vector<int> temp1(1); temp1[0] = A[i]; mat1.push_back(temp1); } for (i = size_A - 2; i > -1; i--)//②③ { int count = 0; vector<int> temp2(10); for (j = size_A - 1; j > i; j--)//④ if (mat[j][i] == 1) { temp2[count] = A[j]; count++; } if (count != 0)//⑤ { int size_mat1 = mat1.size(); for (j = 0; j < size_mat1; j++) { vector<int> v3(10); int num = 0; for (k = 0; k < mat1[j].size(); k++) for (m = 0; m < count; m++) if (mat1[j][k] == temp2[m]) { v3[num] = temp2[m]; num++; break; } if (num != 0) { v3[num] = A[i]; while (num < 9) { v3.pop_back(); num++; } mat1.push_back(v3); } } DeleteRepeat(mat1);//⑥ } } cout << "所有极大相容类有:" << endl; for (i = 0; i < mat1.size(); i++)//输出R中所有的极大相容类 { cout << "{"; for (j = 0; j < mat1[i].size(); j++) { cout << mat1[i][j]; if (j < mat1[i].size() - 1) cout << ","; } cout << "}" << endl; }}//MaximalCompatibleClass//=============================================================================int Reflexivity(vector<vector<int>> mat)//判断关系R是否具有自反性{ int r = 1; for (int i = 0; i < mat.size(); i++) for (int j = 0; j < mat[i].size(); j++) if (i == j&&mat[i][j] != 1) { r = 0; return r; } return r;}//Reflexivity//=============================================================================int Symmetry(vector<vector<int>> mat)//判断关系R是否具有对称性{ int s = 1; for (int i = 0; i < mat.size(); i++) for (int j = 0; j < mat[i].size(); j++) if (i != j&&mat[i][j] != mat[j][i]) { s = 0; return s; } return s;}//Symmetry//=============================================================================void PrintA(vector<int> A){ cout << "集合A的元素为:" << endl; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl;}//PrintA//=============================================================================void PrintMat(vector<vector<int>> mat){ cout << "关系矩阵为:" << endl; for (int i = 0; i < mat.size(); i++) { for (int j = 0; j < mat[i].size(); j++) cout << mat[i][j] << " "; cout << endl; }}//PrintMat//=============================================================================void main(){ vector<int> A(10); vector<vector<int>> mat; int d; cout << "请输入产生集合A及关系矩阵的方式 1)--键盘输入 2)--系统定义" << endl; cin >> d; switch (d) { case 1: { int num; InputA(A,num); Inputmat(mat,num); } case 2: { A = { 1, 2, 3, 4, 5, 6 }; mat = { { 1, 1, 1, 0, 0, 0 }, { 1, 1, 1, 1, 1, 0 }, { 1, 1, 1, 1, 0, 0 }, { 0, 1, 1, 1, 1, 0 }, { 0, 1, 0, 1, 1, 0 }, { 0, 0, 0, 0, 0, 1 } }; } }//switch PrintA(A); cout << endl; PrintMat(mat); cout << endl; if (Reflexivity(mat) && Symmetry(mat)) { cout << "关系R是集合A上的相容关系!" << endl << endl;; MaximalCompatibleClass(A, mat); } else cout << "关系R不是集合A上的相容关系!" << endl; cout << endl;}//main//=============================================================================
11 0
- 【离散数学实验】相容关系的极大相容类的计算
- DML锁之间的相容关系以及实验
- 离散数学中关于等价与相容的一些理解
- 大脑的机械性与适应性的相容
- 事件的互不相容和独立的区别
- 文化相容度高的国家最受发包方青睐
- 飞思卡尔推出四款脚位相容的64位处理器
- Android自定义图形,图形的拼接、叠加、相容
- 相容方程
- 离散数学 求偏序关系极大极小元的两种思路
- 【离散数学实验】关系R的性质判断
- 【离散数学实验】关系R的幂运算及其传递闭包的计算
- 事件的独立和事件互不相容两个概念的区别
- c/c++的“按名字等价,按布局相容”原则(PAGE-14)
- 相似者相容
- 独立与相容
- 离散数学实验之求解关系的闭包运算
- 离散数学与计算机的关系
- 关于应用程序的开机启动界面
- JSTL中var和target 标签的用法
- 下拉刷新之 swipeRefreshLayout
- SSH反向代理实现外网访问内网服务器
- eclipse mars离线 配置hibernate 插件心得
- 【离散数学实验】相容关系的极大相容类的计算
- 如何快速掌握一门技术
- bzoj 1877: [SDOI2009]晨跑
- linux内存文件系统
- 表
- maven下搭建spring mvc
- [Cocos2d-x]创建一个新的HelloWorld
- Solr之——整合Tomcat
- 快学scala习题(五)