离散实验 实验四 关系闭包计算

一、实验目的

	熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

实验内容

定义1  设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则
①  R1是自反的(对称的、传递的)
②  RR1
③	对任何自反的(对称的、传递的)关系R2,若RR2,则R1R2。
R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。
定理1  令RAA,则
①  r(R)=R∪IA
②  s(R)=R∪R-1
③  t(R)=R∪R2∪R3…
Warshall算法:设R是n个元素集合上的二元关系,M是R的关系矩阵;
(1)	置新矩阵A:=M
(2)	置i:=1;
(3)	for j=1 to n do
   		if  A[j,i]=1 then do
      	for  k=1  to  n  do
                  A[j,k]:=A[j,k]+A[i,k]
(4)	i=i+1;
(5)	 if  i<=n  then  to  (3) 
		else stop
本实验要求从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,
计算传递	闭包时使用Warshall算法。

三、实验源程序

#include 
using namespace std;
int main()
{
     
     int n,k,a[99][99],b[99][99],c[99][99], i,j;
    cout<<"请输入关系矩阵行或列数n:"<<endl;
    cin>>n; 
    cout<<"请输入关系矩阵:"<<endl;
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        cin>>a[i][j];
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
     
            b[i][j]=a[i][j];
            c[i][j]=a[i][j];
        }
    for(i=1;i<=n;i++)
        b[i][i]=1;
   cout<<"矩阵的自反闭包是:"<<endl;
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
     
            cout<<b[i][j]<<" ";
            if(j==n)
            cout<<endl;
        }
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
     
            if(c[i][j]==1)
			c[j][i]=1;
        }
    cout<<endl; 
    cout<<"矩阵的对称闭包是:"<<endl;
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
     
            cout<<c[i][j]<<" ";
            if(j==n)
            cout<<endl;
        }
    for (j=1;i<=n;i++)
        for(i=1;j<=n;j++)
        {
     
            if(a[i][j]==1 )
			{
     
				for(k=1;k<=n;k++)
				a[i][k]=a[i][k]+a[j][k]; 
			}
        }
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(a[i][j]>=1)
			a[i][j]=1;
   cout<<"矩阵的传递闭包是:"<<endl;
    for (i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
     
            cout<<a[i][j]<<" ";
            if(j==n)
            cout<<endl;
        }
    return 0;
}

你可能感兴趣的:(离散实验)