【离散数学实验】相容关系的极大相容类的计算

原创 2015年11月18日 22:45:34



相容关系的极大相容类的计算.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
//=============================================================================




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【离散数学实验】关系R的性质判断

#include #define Max 10 using namespace std; class Relation//定义Relation类,存放关系R的元素 { public:  int ha...

【离散数学】实验二 集合上二元关系性质判定的实现

先打个草稿,今晚看书理解下,明天实现。 内容: 编程实现任意集合上二元关系的性质判定。 要求: 能正确判定任意二元关系的自反性、对称性、传递性、反自反性和反对称性。 代码:

南邮离散数学实验2 集合上二元关系性质判定的实现

#include using namespace std; int const MAX = 1000; int matrix[MAX][MAX]; //矩阵 int n; ...

南京邮电大学离散数学实验三偏序关系中盖住关系的求取及格论中有补格的判定

微博账号:两个善良的孩子 欢迎私信留言 一、 实验目的和要求 内容: 编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格。 要求: 对任意给定正整数,利...

南邮离散数学实验3 偏序关系中盖住关系的求取及格论中有补格的判定

因为该偏序集中任意两个元素的最小公倍数和最大公约数就是这两个元素的最小商界和最大下界因此它是格 cal_factor()函数计算因子,用1到n/2(一个正整数n除了它本身的其他因子显然是小于等于n/2...

【离散数学】实验三 偏序关系中盖住关系的求取及格论中有补格的判定

1.实验目的     编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应的偏序集是否为格。   2.实验要求    对任意给定的正整数,利用整除关系求所有由其因子构成的集合所构成的格,判断其...

【离散数学】最大元素、最小元素、极大元素、极小元素、上界、下界、最小上界(上确界)、最大下界(下确界)

设(A, ≤)是一偏序集合,B是A的子集。 最大元素、最小元素: (1)元素b∈B是B的最大元素,如果对每一元素x∈B,x≤b (2)元素b∈B是B的最小元素,如果对每一元素x∈B,b≤x 即:对于...

南邮离散数学实验-利用真值表输出主析取范式主合取范式

要求:  输入真值表(1/0),输出相应的zhu

南邮离散数学实验 利用真值表法求取主析取范式以及主合取范式的实现

一、    实验目的和要求 内容: 编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。 要求: 能够列出任意合式公式的真值表并给出相应主析取和主合取范式。 内容: 编程实现用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)