首页 > 编程知识 正文

构造一个偏序关系,偏序关系和等价关系的区别

时间:2023-05-04 19:16:59 阅读:268042 作者:4463

偏序关系

Description
给定有限集上二元关系的关系矩阵,确定这个关系是否是偏序关系。

Input
多组测试数据,对于每组测试数据,第1行输入正整数n(1 <= n <= 100),第2行至第n+1行输入n行n列的关系矩阵。

Output
对于每组测试数据,若为偏序关系,则输出yes,反之,则输出no。

Sample
Input
4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
4
1 0 0 1
0 1 0 0
0 0 1 0
1 0 0 1
Output
yes
no
Hint
偏序关系形式定义:设R是集合A上的一个二元关系,若R满足自反性、反对称性、传递性,则称R为A上的偏序关系。
1自反:对于自反关系,比较简单的解释就是任意在X集合中的元素都必须是在A中成对出现。
对于任意X中的元素x,<x,x>都属于A;
X={1,2,3} 若为自反必须有A={<1,1>,<2,2>, < 3,3 >};(A中可以包含其他元素,但X不可以再增加。)
否则不构成自反条件

2 反自反:而对于反自反关系,则是根据自反关系来的,既不包括满足自反关系。
对于任意X中的元素x,<x,x>都不属于A
X={1,2,3} ,A={<1,1>}这并不是自反关系,因为1符合条件不满足结论

3 对称关系:这是比较简单来判断的,在A中寻找全部属于X的元素,再将其倒置,如果存在A中,既符合。
对于任意的x和y属于X,如果<x,y>属于A,那么<y,x>属于A
X={1,2,3} ,A={<1,2>,<1,3>,< 3,1>}
这是不满足条件的,因为<1,2>符合条件却不满足结论,如果再将<2,1>加上就符合条件。

4 反对称关系:这里反对称也是从A下手,进行寻找。
对于任意<x,y>,<y,x>属于A,那么x,y属于X
X={1,3} ,A={<1,2>,<1,3>,< 3,1>}
这是满足反对称关系的,因为<1,3>,< 3,1>是满足条件的,而1,3也存在于X中,而只有<1,2>是不符合条件的,因此满足反对称。

5 传递关系:传递关系是比较复杂的,不是很容易就可以在关系图与关系矩阵中看到的。
对于任意<x,y>和<y,z>属于A,那么<x,z>也属于A
对于上述五种关系,空关系除自反不满足以外,其余四种关系全部满足。

在这里对关系矩阵关系图的判断方法进行一个简单的介绍:课本P113

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int main(){ int a[110][110],n; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&a[i][j]); int flag=1; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(a[i][i]==0)//自反:判断主对角线是否全部为1,不满足即停止判断 { flag=0; break; } if(a[i][j]==1&&a[j][i]==1&& j!=i)//反对称:关于主对角线对称元素不可以同是1,排除主对角线 { flag=0; break; } if(a[i][j]==1)//这里判断传递性,找到存在元素,进行遍历 { for(int k=0; k<n; k++) { if(a[j][k]==1)//判断是否有元素满足条件 { if(a[i][k]!=1)//满足条件不满足结论退出循环 { flag = 0; break; } } } } } } if(flag==0) printf("non"); else printf("yesn"); }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。