POJ 1094: Sorting It All Out( 拓扑排序 )

本文深入探讨了排序算法的原理、实现及其在不同场景中的应用,包括全序与偏序的概念,以及如何通过拓扑排序来解决实际问题。通过具体实例展示了如何通过输入关系确定排序序列,遇到冲突时如何判断,并在所有关系输入后得出结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Time Limit: 1000MS
Memory Limit: 10000K
Total Submissions: 26866
Accepted: 9267

Description

An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

Input

Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

Output

For each problem instance, output consists of one line. This line should be one of the following three:

Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.

where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.

Sample Input

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.


要看清题。。。。

Sorted sequence determined after 4 relations: ABCD.  
输入前4个关系后,决定出了一个序列(关系总数可能大于4)

Inconsistency found after 2 relations.
输入前2个关系后,冲突出现了(环,关系总数可能大于2)

Sorted sequence cannot be determined.
所有关系输入后,序列和冲突均无出现


偏序与全序:

从离散数学的角度来看,拓扑排序就是由某集合上的一个偏序得到该集合上的一个全序。
直观的来说,偏序即集合中仅部分元素间可比较(存在某些元素间无法比较),全序即集合中所有元素间均可比较。

更直观地,一个偏序可以是一个流程图,表示完成某项任务过程中各个步骤之间的次序关系,拓扑排序的任务是在这个偏序上得到一个全序,即得到一个完成整个项目的各步骤的序列。

排序依赖的原则就是各个步骤之间的优先关系。

拓扑排序得到的序列不一定是唯一的,因为某些步骤间没有规定优先关系(这就是偏序的特点),在拓扑排序的时候人为的加入一些规则,使得到的序列为满足偏序关系的一个全序。

用一个有向无环图更加有助于理解。



#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>

using namespace std;

const int M = 30 ;
const int N = 1000 + 50;
int n, m;
char inchar[N][M];
char outchar[M];
int in[M];
int cut;
vector<int>amap[M];
int flag;

int toposort()
{
    cut = 0;
    queue<int>que;
    int temp[M];
    memcpy( temp, in, sizeof( in ) );
    bool all_out = true;   //是否是全序的标记
    for( int i=0; i<n; i++ )
        if( !temp[i] )
        que.push( i );
    while( !que.empty() )
    {
        if( que.size()>1 )  //若队列里不是一个元素时,就不是全序的了
            all_out = false;
        int a = que.front();
        que.pop();
        outchar[ cut++ ] = a + 'A';
        for( int i=0; i<amap[a].size(); i++ )
        {
            int b = amap[a][i];
            if( --temp[b]==0 ) //若元素多次出现, 则先不进队
                que.push( b );
        }
    }
    if( cut<n )
        return -1;  //cut<n, 说明存在环,冲突
    else if( all_out==true ) 
        return 1;
    else
        return 0;
}

int main()
{
    while( scanf( "%d%d", &n, &m )==2 &&n &&m )
    {
        memset( in, 0, sizeof( in ) );
        for( int i=0; i<n; i++ )
            amap[i].clear();
        for( int i=0; i<m; i++ )
            scanf( "%s", inchar[i] );
        flag = 0;
        int cas;
        for( cas=0; cas<m; cas++ )
        {
            int a = inchar[cas][0] - 'A';
            int b = inchar[cas][2] - 'A';
            amap[a].push_back( b );
            in[b]++;
            flag = toposort();
            if( flag!=0 )
                break;
        }
        outchar[n] = '\0';  // 注意在输出的数据后加个结束符
        if(flag==1) printf("Sorted sequence determined after %d relations: %s.\n", cas+1, outchar);
        else if(flag==0) printf("Sorted sequence cannot be determined.\n");
        else if(flag==-1) printf("Inconsistency found after %d relations.\n", cas+1);
    }

    return 0;
}






CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值