偏序关系

偏序关系

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem 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

Sample Output

yes
no


法1:

#include<stdio.h>



int main(void)
{
    int i, n, j, k, flag, a[101][101];


    while(~scanf("%d", &n))
    {
        flag = 1;


        for(i = 1; i <= n; i++)
        {
            for(j = 1; j <= n; j++)
            {
                scanf("%d", &a[i][j]);
            }
        }


        // 自反性


        for(i = 1; i <= n; i++)
        {
            if(a[i][i] == 0)
            {
                flag = 0;
                break;
            }
        }


        //反对称性
        //传递性


        for(i = 1; i <= n; i++)
        {
            for(j = 1; j <= n; j++)
            {
                if(i != j && a[i][j] && a[j][i])
                {
                    flag = 0;
                    break;
                }


                if(a[i][j])
                {
                    for(k = 1; k <= n; k++)
                    {
                        if(a[j][k])
                        {
                            if(a[i][k] == 0)
                            {
                                flag = 0;
                                break;
                            }
                        }
                    }
                }
            }
        }


        if(flag)
        {
            printf("yes\n");
        }


        else
        {
            printf("no\n");
        }
    }


    return 0;

}


法2:

#include<stdio.h>


int main(void)
{
    int i, n, flag, a[101][101], j, k;//cb无法运行可能是数组开大了


    while(~scanf("%d", &n))
    {
         flag = 1;


         for(i = 1; i <= n; i++)
        {
            for(j = 1; j <= n; j++)
            {
                scanf("%d", &a[i][j]);
            }
        }


        for(i = 1; i <= n; i++)
        {
            if(a[i][i] != 1)
            {
                flag = 0;
                break;
            }
        }


        for(i = 1; i <= n; i++)
        {
            for(j = 1; j <= n; j++)
            {
                if(i != j && a[i][j])
                {
                    if(a[j][i])
                    {
                        flag = 0;
                        break;
                    }
                }
            }


            if(flag == 0)
            {
                break;
            }
        }


        for(i = 1; i <= n; i++)
        {
            for(j = 1; j <= n; j++)
            {
                if(a[i][j])
                {
                   for(k = 1; k <= n; k++)
                   {
                       if(a[j][k])
                       {
                           if(a[i][k] == 0)
                           {
                               flag = 0;
                               break;
                           }
                       }
                   }
                }
            }
        }


        if(flag)
        {
            printf("yes\n");
        }


        else
        {
            printf("no\n");
        }
    }


    return 0;
}

扫描二维码关注公众号,回复: 2252591 查看本文章

猜你喜欢

转载自blog.csdn.net/eider1998/article/details/80547124