大二(上)离散数学 集合的二元关系

#include <iostream>
#include <string.h>
using namespace std;
const int MAX = 100;
int num;
int rnum;
int R[MAX][MAX];
int A[MAX][MAX];
void  Warshall()       //Warshall算法
{
	for (int i = 1; i <= num; i++)      //置新矩阵A 
	{
		for (int j = 1; j <= num; j++)
		{
			A[i][j] = R[i][j];
		}
	}
	for (int i = 1; i <= num; i++)      //对所有j如果A[j,i]=1,则对k=1,2,...,n ;A[j][k] = A[j][k] + A[i][k];
	{
		for (int j = 1; j <= num; j++)
		{
			if (A[j][i] == 1)
			{
				for (int k = 1; k <= num; k++)
				{
					A[j][k] = A[j][k] + A[i][k];
					if (A[j][k] >= 1)
					{
						A[j][k] = 1;
					}
				}
			}
		}
	}
}

int  Zifan()         //自反性  对角线为1 
{
	for (int i = 1; i <= num; i++)
	{
		if (R[i][i] != 1)
			return 0;
	}
	return 1;
}

int  Duichen()       //对称性  以对角线对称的元素同时为1 
{
	for (int i = 1; i <= num; i++)
	{
		for (int j = 1; j <= num; j++)
		{
			if (R[i][j] != R[j][i])
				return 0;
		}
	}
	return 1;
}

int  Chuandi()      //传递性  利用Warshall,t(R)=R;
{
	Warshall();
	for (int i = 1; i <= num; i++)
	{
		for (int j = 1; j <= num; j++)
		{
			if (A[i][j] != R[i][j])
				return 0;
		}
	}
	return 1;
}

int  Fanzifan()     //反自反性 对角线元素为0 
{
	for (int i = 1; i <= num; i++)
	{
		if (R[i][i] == 1)
			return 0;
	}
	return 1;
}

int  Fanduichen()   //反对称性 以对角线对称的元素不能同时为1 
{
	for (int i = 1; i <= num - 1; i++)
	{
		for (int j = i + 1; j <= num; j++)
		{
			if (R[i][j] == 1 && R[j][i] == 1)
			{
				if (i != j)
					return 0;
			}
		}
	}
	return 1;
}
int main()
{
	cout << "集合的元素个数为:";
	cin >> num;
	cout << "集合的关系个数为:";
	cin >> rnum;
	memset(R, 0, sizeof(R));   //将R中当前位置后面的用 0 替换,并返回 R 
	memset(A, 0, sizeof(A));

	int t1, t2;
	cout << "请输入集合的序偶:" << endl;
	for (int i = 1; i <= rnum; i++)
	{
		cin >> t1 >> t2;
		R[t1][t2] = 1;
	}

	cout << "该集合符合的二元性质有:" << endl;
	if (Zifan())
		cout << "自反性;";
	if (Duichen())
		cout << "对称性;";
	if (Chuandi())
		cout << "传递性;";
	if (Fanzifan())
		cout << "反自反性;";
	if (Fanduichen())
		cout << "反对称性;" << endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43271844/article/details/86551544
今日推荐