Sorting It All Out (拓扑排序)

来源:互联网 发布:电脑监控软件破解 编辑:程序博客网 时间:2024/05/18 00:18

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 6A<BA<CB<CC<DB<DA<B3 2A<BB<A26 1A<Z0 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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绝地求生与ipad不兼容怎么办 小米手机玩绝地求生卡怎么办 绝地求生服务器目前非常繁忙怎么办 玩绝地求生手机发烫怎么办 绝地求生刺激战场延迟高怎么办 怀孕八个半月打喷嚏头疼怎么办 20岁打喷嚏漏尿怎么办 鼻炎犯了不停打喷嚏怎么办 鼻炎犯了不停打喷嚏流鼻涕怎么办 感冒鼻痒怎么办小窍门 腰扭了屁股也疼怎么办 小三把房子过户怎么办 小三把房子卖了怎么办 打印机ip地址变了怎么办 电脑ip地址错误不能上网怎么办 修改了注册表电脑无法启动怎么办 香水喷到衣服上有印怎么办 家里一股猫的味道怎么办 干菊花里面有虫怎么办 安装时显示程序已关闭怎么办 电脑一直重启开不了机怎么办 应用安装在sd卡打不开怎么办 安装ps打不开安装包怎么办 安装好的软件打不开怎么办? win10系统语言修改不了怎么办 一个月婴儿吵夜怎么办 玩游戏一直闪退怎么办 钱站一直闪退怎么办 win7重装连不上网怎么办 笔记本屏幕横过来了怎么办 3D贴图丢了怎么办 百度文库安装后手机打不开怎么办 win7系统不带usb驱动怎么办 手机网页上的pdf打不开怎么办 网页下载pdf后缀是.do怎么办 ps界面太小怎么办win10 ps软件打不开程序错误怎么办 ps打开后 未响应怎么办 ps图层无法解锁怎么办 ie8浏览器电脑不能用怎么办 系统要ie6.0才能打开怎么办