【离散数学实验】相容关系的极大相容类的计算
2015-11-18 22:45
267 查看
相容关系的极大相容类的计算.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
)
{
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
//=============================================================================
相关文章推荐
- bzoj 1877: [SDOI2009]晨跑
- JSTL中var和target 标签的用法
- eclipse mars离线 配置hibernate 插件心得
- 数组连续子数组的最大和
- SSH反向代理实现外网访问内网服务器
- AutoMapper在ABP框架中的使用说明
- 保留小数点后任意位数
- 算法小知识
- 接口
- HDU 1205 吃糖果 (抽屉原理)
- poj2240
- 关于应用程序的开机启动界面
- 媒体:中国大学不应培养“精致的利己主义者”
- 南大软院二十一天成神计划第二天
- Hadoop基本架构之HDFS和MapReduce(上)
- python之批量重命名目录文件
- POJ1185 炮兵阵地 (状态压缩DP)
- [笔记]有关Static初始化的一点小小记忆
- 南大软院21天大神养成计划第3天
- 【Leetcode】Convert Sorted List to Binary Search Tree