Sorting It All Out (拓扑排序)

本文介绍了一种使用拓扑排序算法判断字符间大小关系的方法,并提供了完整的代码实现。针对特定输入,程序能准确判断并输出确定的排序、无法确定排序或存在矛盾的情况。

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

Problem 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: <br> <br>Sorted sequence determined after xxx relations: yyy...y. <br>Sorted sequence cannot be determined. <br>Inconsistency found after xxx relations. <br> <br>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. <br>

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.

题目大概:

看是否成立大小关系,分别对应三种输出关系。

思路:

这道题,是关于比大小的,一般用拓扑排序是解决的是有向无环图,当然也可以检验出是否有环,按照题目上说,有三种输出,一种是组成了大小关系,即形成了环。还有自相矛盾,不能形成大小关系。最后一种是给出条件不能判断关系,由于输出的不同,所以也不能按常理来做这道拓扑排序题,这道题的大小数据应该输入一个,判断一个,一旦发现条件成立就输出,因为输出条件要包含,在哪一个输入下,满足的条件,这就相当于把拓扑排序最外面那层循环和输入条件的循环合并了,再就是控制条件比较多,需要加一些变量来控制输出。

代码:

借鉴自大佬。


#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;

int n,m,r[105],c[105],map[105],t,r1,num;
char a, b, d;
vector<int>w[105];
queue<int>q;

void init(){
    memset(r, 0, sizeof(r));
    for(int i=0; i<=n; ++i){
        w[i].clear();
    }
}

 bool find(int u,int v){
    for(int i=0; i<w[u].size(); ++i)
        if(w[u][i]==v)return true;
    return false;
}

int go(){
    while(!q.empty())q.pop();
    for(int i=0; i<n; ++i)if(r[i]==0){
            q.push(i);
    }
    r1=0;
    bool tt=false;
    while(!q.empty()){
        if(q.size()>1) tt=true;
        int t=q.front();
        q.pop();
        map[r1++]=t;
        for(int i=0; i<w[t].size(); ++i){
            if(--r[w[t][i]]==0)
                q.push(w[t][i]);
        }
    }
    if(r1<n) return 1;
    if(tt)  return 2;
    return 3;
}

int main(){
    int x,y,i,f,ok,stop;
    while(cin>>n>>m){
        if(!n||!m)break;
        init();
        f=2;
        ok=false;
        for(i=1; i<=m; ++i){
            cin>>a>>b>>d;
            if(ok) continue;
            x=a-'A', y=d-'A';
            if(b=='<'&&!find(y,x)){
                   w[y].push_back(x);
                    r[x]++;
            }
            else if(b=='>'&&!find(x,y)){
                    w[x].push_back(y);
                    r[y]++;
            }

            memcpy(c, r, sizeof(r));
            f=go();
            memcpy(r, c, sizeof(c));
            if(f!=2){
                stop=i;
                ok=true;
            }
        }
        if(f==3){
            printf("Sorted sequence determined after %d relations: ", stop);
            for(int i=r1-1; i>=0; --i)
                printf("%c",map[i]+'A');
            printf(".\n");
        }
        else if(f==1){
            printf("Inconsistency found after %d relations.\n",stop);
        }
        else{
            printf("Sorted sequence cannot be determined.\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值