离散数学实验:关系闭包的计算(C语言)

一、实验目的

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

二、实验内容

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算法。用C语言或MATLAB实现。

实验源程序

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
int matrix[100][100];
int n;
void RClosure();//计算自反闭包
void SClosure();//计算对称闭包
void TClosure();//计算传递闭包
void Input();
void Display(int a[100][100]);
int main()
{
	Input();
	RClosure();
	SClosure();
	TClosure();
}
void Display(int a[100][100])
{
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < n;j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
}
void Input()
{
	printf("请输入该关系矩阵的阶数(小于等于100):\n");
	scanf("%d", &n);
	if (n < 0 || n>100)
	{
		printf("非法输入!\n");
		exit(0);
	}
	printf("请输入关系矩阵:\n");
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < n;j++)
		{
			scanf("%d", &matrix[i][j]);
			if (matrix[i][j] > 1 || matrix[i][j] < 0)
			{
				printf("非法输入!\n");
				exit(0);
			}
		}
	}
}
void RClosure()
{
	int a[100][100];
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < n;j++)
		{
			a[i][j] = matrix[i][j];
		}
	}
	for (int i = 0;i < n;i++)
	{
		a[i][i] = 1;//让所有主对角线的元素全是1
	}
	printf("自反闭包是:\n");
	Display(a);
}
void SClosure()
{
	int a[100][100];
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < n;j++)
		{
			a[i][j] = matrix[i][j];
		}
	}
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < n;j++)
		{
			if (a[i][j] == 1)
			//如果第i行第j列元素是1,那让第j行第i列的元素也为1
				a[j][i] = 1;
		}
	}
	printf("对称闭包是:\n");
	Display(a);
}
void TClosure()
{
	int a[100][100];
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < n;j++)
		{
			a[i][j] = matrix[i][j];
		}
	}
	int i, j, k;
	for (i = 0;i < n;i++)
	{
		for (j = 0;j < n;j++)
		{
			if (a[j][i] >= 1)
			{
				for (k = 0;k < n;k++)
				{
					a[j][k] = a[j][k] + a[i][k];
				}
			}
		}
	}

	for (i = 0;i < n;i++)
	{
		for (j = 0;j < n;j++)
		{
			if (a[i][j] > 1)
				a[i][j] = 1;
		}
	}
	printf("传递闭包是:\n");
	Display(a);
}

四、实验分析

只要把Warshall算法伪代码转换成代码,其余的easy.

你可能感兴趣的:(C语言,离散数学)