离散数学实验 三种闭包运算 C++实现

 

通过矩阵的方式去求解三种关系矩阵。

自反:矩阵的对角线都应该为1。例:如果为3×3矩阵则g[0][0]=1,g[1][1]=1,g[2][2]=1。如果不为1,则输出相应的关系。

对称:关于对角线矩阵应该对称。例:g[i][j]=1,则g[j][i]也应该为1。所以根据这种思路判断对称闭包。

传递:通过warshall算法去求传递闭包。


 for (int k = 0; k < n; k++)
 {
  for (int i = 0; i < n; i++)
 {
   for (int j = 0; j < n; j++)
 {
    
    if (g[i][k] && g[k][j]) 
       g[i][j] = 1;  
 }
 }
 }

全代码:

输入集合形式:{a,b,c...}

输入关系形式:({<a,a>,<a,b>....}

输出形式:{<a,a>.....}

#include<iostream>
using namespace std;//闭包运算
char zi[26] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','s','y','z' };
int main()
{
	string A, B;
	cout << "输入集合:(输入形式{a,b,c...})" << endl;
	cin >> A;
	cout << "输入关系:(输入形式({<a,a>,<a,b>....})" << endl;
	cin >> B;
	int g[100][100];
	int n = A.length() / 2;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			g[i][j] = 0;
	char a[100][2];
	int k = 0, t = 0;
	for (int i = 0; i < B.length(); i++)
	{
		if (i % 2 == 0 & i % 3 != 0)
		{
			a[k][t++] = B[i];
		}
		if (t == 2)
		{
			k++;
			t = 0;
		}
	}
	int a1[100][2];
	for (int i = 0; i < k; i++)
		a1[i][0] = a[i][0] - 'a', a1[i][1] = a[i][1] - 'a';
	cout << "关系矩阵:" << endl;
	for (int i = 0; i < k; i++)
		g[a1[i][0]][a1[i][1]] = 1;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			cout << g[i][j] << " ";
		cout << endl;
	}
	cout << "自反闭包 " << "{";
	for (int i = 0; i < n; i++)//自反闭包
	{
		if (g[i][i] == 0)
				cout << "<" << zi[i] << "," << zi[i] << ">";
		for (int j = 0; j < n; j++)
		{
			if (g[i][j] == 1)
				cout << "<" << zi[i] << "," << zi[j] << ">";
		}
	}
	cout << "}" << endl;
	cout << "对称闭包" << "{";
	for (int i = 0; i < n; i++)//对称闭包
	{
		for (int j = 0; j < n; j++)
		{
			if (g[i][j] == 1 && g[j][i] == 0)
				cout << "<" << zi[j] << "," << zi[i] << ">";
			if (g[i][j] == 1)
				cout << "<" << zi[i] << "," << zi[j] << ">";
		}
	}
	cout << "}" << endl;
	cout << "传递闭包" << "{";
	for (int k = 0; k < n; k++)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (g[i][k] && g[k][j])
					if (g[i][j] == 0)
					{
						cout << "<" << zi[i] << "," << zi[j] << ">";
					}
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			if(g[i][j]==1)
				cout << "<" << zi[i] << "," << zi[j] << ">";
	}
	cout << "}";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值