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

原创 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
//=============================================================================




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

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

相容关系的极大相容类的计算.cpp //============================================================================...
  • qq_32353771
  • qq_32353771
  • 2015年11月18日 22:45
  • 1846

C编译器剖析_C类型系统_相容类型Compatible Type

在前文对函数调用进行语义检查时,我们用函数CanAssign()来判断“能否能把实参赋值给形参”,在函数CanAssign中,我们又用宏IsCompatiblePtr来判断两个指针是否相容。而如果指针...
  • SheIsC
  • SheIsC
  • 2015年03月10日 20:28
  • 973

离散数学中关于等价与相容的一些理解

原创作者:Daniel 时间:2017.10.27 等价关系在书中定义是: #设X是任意集合,R是X中的二元关系。如果R是自反的、对称的和可传递的,则R是等价关系。# 实际上,关系R是...
  • zhangyue_lala
  • zhangyue_lala
  • 2017年10月27日 20:49
  • 175

事件的独立和事件互不相容两个概念的区别

实在是对这个感冒了,随从网上拉了一篇资料,免得下次又忘了。 要真正的解决这个问题,必须首先牢牢记住他们的定义。 什么事件的独立? 事件A,B独立是指这两个事件之间的概率满足一个等式:P(AB)=...
  • zyf837368104
  • zyf837368104
  • 2011年12月22日 22:51
  • 45603

.net 之运行环境

.NET 结构 .NET 包括四个组成部分    VOS 类型系统    元数据    公用语言规范    虚拟执行系统 下面分别对它们进行简要介绍 虚拟对象系统    .NET 跨语言集成的特性来自...
  • grland
  • grland
  • 2007年12月30日 18:38
  • 1555

想知道有哪些是spring常用的工具类大全吗?戳进来我告诉你

spring给我们提供了很多的工具类, 应该在我们的日常工作中很好的利用起来. 它可以大大的减轻我们的平时编写代码的长度. 因我们只想用spring的工具类, 而不想把一个大大的spring工程给引入...
  • longdan3105
  • longdan3105
  • 2018年01月11日 11:58
  • 36

事件的互不相容和独立的区别

在学习概率论与数理统计的过程中对互不相容和独立的概念有些混淆,经过网上搜索资料和理解,两者考虑的角度不同,总结如下: 1. 互不相容考虑的是事件是否能同时发生。A和B互不相容的意思是A发生B就不可能...
  • a540366413
  • a540366413
  • 2017年04月01日 16:13
  • 800

区分事件的独立性与互不相容性

区分事件的独立性与互不相容性@(概率论)事件的独立性事件A,B独立是指两个事件之间的概率满足等式:P(AB)=P(A)P(B)P(AB) = P(A)P(B)事件的互不相容性事件A,B互不相容指的是两...
  • u011240016
  • u011240016
  • 2016年11月26日 18:46
  • 646

《C专家编程》:最庞大的实体类型-Bug(二)

Bug是迄今为止地球上最庞大的实体类型,有近百万种已知的品种。在这方面,它比其他任何已知的生物种类的总和还要多,而且至少多出四倍。---摘自Snope教授的Encyclopedia of Animma...
  • gogoky
  • gogoky
  • 2016年05月21日 16:01
  • 778

我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

Android 设备的CPU类型通常称为ABIs问题描述解决方法 1解决之前的截图2解决后的截图3解决方法4建议为什么你需要重点关注so文件App中可能出错的地方其他地方也可能出错 使用a...
  • u010069940
  • u010069940
  • 2018年01月11日 18:51
  • 123
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【离散数学实验】相容关系的极大相容类的计算
举报原因:
原因补充:

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