离散数学实验-C-++关系的运算(幂运算-闭包运算)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验2 关系的运算

(1)关系的幂运算

输入:集合A,二元关系集合R,幂次n

输出:R的n次幂

要求:尽量使运算的计算量最小

(2)关系闭包的计算

输入:集合A,二元关系集合R

输出:R的传递闭包t(R)

要求:

(a)采用Warshall 算法(89页)

(b)编写代码判断输出t(R)为传递闭包程序代码:

#include

#include

#include

using namespace std;

typedef vector< vector > Mat;

class Relation{

vectors;//集合

Mat A;//关系矩阵

Mat B;

Mat C;

Mat E;

Mat D[100]; //用来存储矩阵

int n;

public:

void inputs();//将集合存入向量中

void inputa();//将读入的关系转化为关系矩阵

void print();//输出关系矩阵

void mi();

int Warshall();

};//定义类

int n,m;//全局变量,下文中使用

void Relation::inputs(){

cout<<"输入集合";

for(int a;cin>>a;){

s.push_back(a);

if(getchar()=='\n')

break;}

}//将集合存入向量中

void Relation::inputa(){//将读入的关系转化为关系矩阵

cout<<"输入关系";

int i,j,e,r;

for(i=0;i

vector u;

for(j=0;j

int ia=0;

u.push_back(ia);}

A.push_back(u);

B.push_back(u);

C.push_back(u);

E.push_back(u);

}//创建二维向量,初始化,是每个元素为0

for(int h,z;cin>>h>>z;){

if(h==0&&z==0)

break;

for(i=0;i

if(s[i]==h) e=i;

if(s[i]==z) r=i;

}

A[e][r]=1;B[e][r]=1;

E[e][r]=1;//C[e][r]=1;//读入关系,将关系对应的矩阵

中的位置元素变为1

if(getchar()=='\n')

break;

}

}

void Relation::print(){

for(int i=0;i

for(int j=0;j

cout<

cout<

}

}//输出关系矩阵

void Relation::mi(){

int a,b,i,c;

cin>>n; //读入幂次

if(n==0){ //0次幂

for(int k=0;k

for(int j=0;j

if(k==j)

cout<<"1 "; //对角线上元素为1

else

cout<<"0 ";

}

cout<

}

}

else{

for(i=1;i

for(int h=0;h

for(int d=0;d

int m=0;

for(int x=0;x

m=m+B[h][x]*A[x][d]; //第h 行第d列的元素对应相乘的和

}

C[h][d]=m;

}

}

if(i>1){

for(a=0;a

for(b=0;b

if(C[a][b]!=D[0][a][b])

break;

}

if(b!=s.size())break;

}

}//检验是否重复

if(a==s.size()&&b==s.size()){

break;//重复则跳出不再幂乘

}

for(int k=0;k

for(int j=0;j

B[k][j]=C[k][j];

}

D[i-1]=B;

c=i;

}

}

if(a==s.size()&&b==s.size()){

int q;

q=(n-i)%c; //找出结果位置if(q==0) q=c;

for(int e=0;e

for(int f=0;f

相关文档
最新文档