• 离散数学:用C语言来判断集合存在的二元关系


    用C语言来判断是否满足自反,反自反,非自反,对称,反对称,非对称和传递性

    也不知道写的对不对。没有大量验证,但是随便找的一些关系测试的没毛病,如果错了,欢迎各位大佬留言

    #include<bits/stdc++.h>
    const int maxn=1e3+10;
    int a[maxn][maxn];
    int vis[maxn][maxn];
    int v[maxn][maxn];
    int num,s_ize;
    int res;
    void relation1()//判断自反,反自反,非自反
    {
    	int flag=0;
    	for(int i=1;i<=num;i++)
    	{
    		if(a[i][i])
    			flag++;
    	}
    	if(flag==num)
    		printf("满足自反性
    ");
    	else if(flag!=num&&flag!=0)
    		printf("满足非自反性
    ");
    	else if(!flag)
    		printf("满足反自反性
    ");
    }
    void relation2()//判断对称
    {
    	int flag=0;
    	for(int i=1;i<=num;i++)
    	{
    		for(int j=1;j<=num;j++)
    		{
    			if(a[i][j]==a[j][i]&&vis[i][j])
    			{
    				flag++;
    				vis[i][j]=0;
    			}
    		}
    	}
    	if(flag==s_ize)
    	{
    		printf("满足对称性
    ");
    		res++;
    	}
    }
    void relation3()//反对称,非对称 
    {
    	int flag=0;
    	for(int i=1;i<num;i++)
    	{
    		for(int j=i+1;j<=num;j++)
    		{
    			if(a[i][j]&&a[j][i]&&i!=j)
    			{
    				flag++;
    				break;
    			}
    		}
    	}
    	if(flag==0)
    	{
    		res++;
    		printf("满足反对称性
    ");
    	}
    	if(!res)
    		printf("满足非对称性
    ");
    }
    void relation4()//传递性
    {
    	int flag=1;
    	int num1,num2;
    	for(int i=1;i<s_ize;i++)
    	{
    		for(int j=2;j<=s_ize;j++)
    		{
    			if(v[i][2]==v[j][1])
    			{
    				num1=v[i][1],num2=v[j][2];
    				if(vis[num1][num2]!=1)
    				{
    					flag=0;
    					break;
    				}
    			}
    		}
    		if(!flag)
    			break;
    	}
    	if(!flag)
    		printf("不满足传递性
    ");
    	else
    		printf("满足传递性
    ");
    }
    int main(int argc, char const *argv[])
    {
    	printf("---------开始进行二元关系的判断---------
    ");
    	printf("请输入需要执行的次数
    ");
    	int t;
    	scanf("%d",&t);
    	int T=0;
    	while(t--)
    	{
    		printf("******Case%d:请输入集合中的元素个数******
    ",++T);
    		scanf("%d",&num);
    		if(num<=0)
    			break;
    		printf("请输入集合中的关系个数:
    ");
    		scanf("%d",&s_ize);
    		printf("请输入集合中的关系元素,一共有 %d 对关系 %d 个元素(请以整数形式输入) 
    ",s_ize,2*s_ize);
    		int x,y;
    		res=0;
    		memset(a,0,sizeof(a));
    		memset(vis,0,sizeof(vis));
    		for(int k=1;k<=s_ize;k++)
    		{
    			scanf("%d%d",&x,&y);
    			v[k][1]=x;
    			v[k][2]=y;
    			a[x][y]=1;
    			vis[x][y]=1;
    		}
    		int i,j;
    		printf("**********输出关系矩阵**********
    ");
    		for(i=1;i<=num;i++)
    		{
    			for(j=1;j<=num;j++)
    			{
    				printf("%d	",a[i][j]);
    			}
    			printf("
    ");
    		}
    		relation1();
    		relation2();
    		relation3();
    		relation4();
    		printf("
    ");
    	}
    	printf("********************感谢使用********************
    ");
    	return 0;
    }


  • 相关阅读:
    sql TRUNCATE 和 delete 的区别
    visual studio 2005 service pack 1
    gac 详细的步骤
    简单判断用户重复登录,记录一下
    [转]在SQL Server中使用CLR调用.NET方法
    xml 解析之 JDOM解析
    Java反射机制——反射 API(Day_04)
    结合JVM 浅谈Java 类加载器(Day_03)
    jsoup select 选择器(Day_02)
    SQLite在Android中的使用
  • 原文地址:https://www.cnblogs.com/Friends-A/p/9308986.html
Copyright © 2020-2023  润新知