【C语言】拓扑排序算法查找有限偏序集(A,£)、理解最大元、最小元、最大元、最小元的定义和性质。

  • 实验目的

Acquiring proficiency in topological sorting algorithm and using it to find a topological sorting of a finite poset(A, £). Comprehending the definition and properties of greatest element, least element, maximal element, minimal element.

  • 实验内容

Using C-language to find a topological sorting of a finite poset(A, £), and judge whether there is a greatest element, a least element, find the maximal element, minimal element.

  • 使用环境

Win 11 & visual studio code 2022

  • 算法介绍

Algorithm: topological sorting algorithm

Input: a finite poset(A, £)

Output: a array “SORT” with all elements of the poset

Begin

Step 1: Choose a minimal element a of A.

Step 2: Make a the next entry of SORT and replace A with A {a}.

Step 3: Repeat step 1 and 2 until A = { }.

End

Find the maximal element, the minimal element.

Begin

Step 1: find the column with every entries are 0

Step 2: Find the corresponding element       , that is the minimal element

Step 1: find the row with every entries are 0

Step 2: Find the corresponding element       , that is the maximal element

End

  • 调试过程

  1. 调试代码

#include <stdio.h>
int R[100][2], M[10][10] = {0}; // R是关系,M是关系矩阵
void topu(int a)
{
    int i, j, sum = 0, col = 0, row = 0, max[a], min[a], sort[a];
    for (j = 0; j < a; j++) //找最小
    {
        for (i = 0; i < a; i++)
        {
            sum += M[i][j];
        }
        if (sum == 0)
        {
            min[col] = j;
            col++;
        }
        else
            sum = 0;
    }
    for (i = 0; i < a; i++) //找最大
    {
        for (j = 0; j < a; j++)
        {
            sum += M[i][j];
        }
        if (sum == 0)
        {
            max[row] = i;
            row++;
        }
        else
            sum = 0;
    }
    int b = 0, t1 = col - 1, t2 = 0, t3 = col; // t为临时变量
    while (b < a)                              //拓扑排序
    {
        for (; t1 >= t2; t1--)
        {
            sort[b] = min[t1] + 1;
            b++;
            for (j = 0; j < a; j++)
                M[min[t1]][j] = 0;
        }
        t2 = t3;
        t1 = t3;
        for (j = 0; j < a; j++)
        {
            if (j == min[0] || j == min[1] || j == min[2])
                continue;
            else
            {
                for (i = 0; i < a; i++)
                {
                    sum += M[i][j];
                }
                if (sum == 0)
                {
                    min[t1] = j;
                    t1++;
                }
                else
                    sum = 0;
            }
        }
        t3 = t1;
        t1--;
    }
    for (b = 0; b < a; b++) //输出拓扑排序
    {
        printf("%d", sort[b]);
    }
    printf(" is the topu order\n");
    if (col > 1) //输出最小元,极小元
    {
        printf("There is no least element\n");
        printf("The minimal elements are ");
        for (col = col - 1; col >= 0; col--)
            printf("%d ", min[col] + 1);
    }
    else
        printf("The least element is %d\n", min[col] + 1);
    if (row > 1) //输出最大元,极大元
    {
        printf("\nThere is no greatest element\n");
        printf("The maximal elements are ");
        for (row = row - 1; row >= 0; row--)
            printf("%d ", max[row] + 1);
    }
    else
        printf("The greatest element is %d\n", max[row] + 1);
}
int main()
{
    int vert, edge, i, j;
    int(*p1)[2], (*p2)[10];
    p1 = R;
    p2 = M;
    printf("input the vertices and edges:");
    scanf("%d %d", &vert, &edge);
    printf("input the relation(such '1 3'):");
    for (i = 0; i < edge; i++) //输入关系
        scanf("%d %d", (*(p1 + i)), (*(p1 + i) + 1));
    for (i = 0; i < edge; i++) //关系转化为矩阵
    {
        M[*(*(p1 + i)) - 1][*(*(p1 + i) + 1) - 1] = 1;
    }
    for (i = 0; i < vert; i++) //输出M
    {
        for (j = 0; j < vert; j++)
        {
            printf("%d ", *(*(p2 + i) + j));
        }
        printf("\n");
    }
    topu(vert);
    return 0;
}
  1. 运行结果

  • 总结

Two array structures are defined to store the entry degree of each vertex and the vertex serial number of the topological sorting record. Starting from the first vertex without entry degree, output all vertices without entry degree in turn and remove them from the existing graph. At the same time, remove the edges attached to this node and other nodes. The final output vertex sequence is the topological sort sequence. It should be noted that the results of topological sort sequence of some directed acyclic graphs are not unique.

  • 参考文献

[1]谭浩强,C 程序设计[M] (第四版).北京:清华大学出版社,2010年6月(中国高等院校计算机基础教育课程体系规划教材)

[2]谭浩强, C 程序设计( 第四版 )学习辅导 ,北京:清华大学出版社,2010年7月(中国高等院校计算机基础教育课程体系规划教材)

[3]C Primer Plus (第6版)中文版,Stephen Prata 著;姜佑译 ——北京 :人名邮电出版社,2019.11

偏序集中,我们首先要理解上界和下界的概念。 在一个偏序集中,如果存在素a,使得对于任意的素b,如果b小于等于a,则可以说a是b的上界。换句话说,对于偏序集中的任意素b,都有b≤a。同样地,如果存在素c,使得对于任意的素d,如果d大于等于c,则可以说c是d的下界。换句话说,对于偏序集中的任意素d,都有d≥c。 偏序集中,如果素a是b的上界,而素c是d的下界,则我们可以说a是b和d的上界,c是b和d的下界。这里b和d可以是不同的素。 最小上界指的是在所有的上界中,最小的那个上界。最大下界则指在所有的下界中,最大的那个下界。 对于给定素b,在偏序集中求其上界和下界,我们首先要找到满足条件的素a和c。然后从所有满足条件的a中找到最小的上界,记为min_s,再从所有满足条件的c中找到最大的下界,记为max_i。这样就得到了b的上界下界。 需要注意的是,在一个偏序集中,可能存在多个上界和下界。因此,我们要找到最小的上界和最大的下界,以确保它们能够覆盖所有的上界和下界。 总结起来,在偏序集中求解素b的上界下界的步骤如下: 1. 找到满足条件的a和c,使得b≤a和d≥c。 2. 从所有满足条件的a中找到最小的上界,记为min_s。 3. 从所有满足条件的c中找到最大的下界,记为max_i。 4. 最小上界为min_s,最大下界为max_i。 这样就可以求得素b的上界下界的最小上界和最大下界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值