poj 1094 拓扑排序

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.题意:

这道题有隐含这一信息,每输入一对关系,如果判定有结果,则可以忽略后面输入数据,即使后面输入数据能改变结果,也不用管。所以应该每输入一个关系就去更新当前的图,然后进行一趟拓扑排序。一旦产生结果,再对后面的数据处理下,就可以输出结果。

一、当输入的字母全部都在前n个大写字母范围内时:

(1) 最终的图 可以排序:

在输入结束前如果能得到最终的图(就是用这n个字母作为顶点,一个都不能少);而且最终得到的图  无环;只有唯一一个 无前驱(即入度为0)的结点,但允许其子图有多个无前驱的结点。

在这步输出排序后,不再对后续输入进行操作

(2)输出矛盾

在输入结束前如果最终图的子图有环

在这步输出矛盾后,不再对后续输入进行操作

(3)输出无法确认排序

这种情况必须全部关系输入后才能确定,其中又有2种可能

①最终图的字母一个不缺,但是有多个  无前驱结点

②输入结束了,但最终的图仍然字母不全,与 无前驱结点 的多少无关

二、当输入的字母含有 非前n个大写字母 的字母时(超出界限):

(1)       输出矛盾

输入过程中检查输入的字母(结点),若 前n个大写字母 全部出现,则在最后一个大写字母出现的那一步 输出矛盾

(2)       输出无法确认排序

最后一步输入后,前n个大写字母 仍然未全部出现,则输出 无法确认排序

PS:在使用“无前驱结点”算法时必须要注意,在“矛盾优先”的规律下,必须考虑一种特殊情况,就是多个无前驱结点与环共存时的情况,即输入过程中子图都是有 多个无前驱结点,最后一步输入后出现了环,根据算法的特征,很容易输出“不能确认排序”,这是错的,必须适当修改算法,输出“矛盾”。

#include<stdio.h>
#include<string.h>
int map[27][27],indegree[27],q[27];
int TopoSort(int n) //拓扑排序
{
    int c=0,temp[27],loc,m,flag=1,i,j;  ////flag=1:有序 flag=-1:不确定
    for(i=1;i<=n;i++)
        temp[i]=indegree[i];
    for(i=1;i<=n;i++)
    {
        m=0;
        for(j=1;j<=n;j++)
            if(temp[j]==0) { m++; loc=j; }  //查找入度为零的顶点个数
        if(m==0) return 0;  //有环
        if(m>1) flag=-1;  // 无序
        q[c++]=loc;   //入度为零的点入队
        temp[loc]=-1;
        for(j=1;j<=n;j++)
            if(map[loc][j]==1) temp[j]--;
    }
    return flag;
}

int main()
{
    int m,n,i,sign;  //当sign=1时,已得出结果
    char str[5];
    while(scanf("%d%d",&n,&m))
    {
        if(m==0&&n==0) break;
        memset(map,0,sizeof(map));
        memset(indegree,0,sizeof(indegree));
        sign=0;
        for(i=1;i<=m;i++)
        {
            scanf("%s",str);
            if(sign) continue; //一旦得出结果,对后续的输入不做处理
            int x=str[0]-‘A‘+1;
            int y=str[2]-‘A‘+1;
            map[x][y]=1;
            indegree[y]++;
            int s=TopoSort(n);
            if(s==0) //有环
            {
                printf("Inconsistency found after %d relations.\n",i);
                sign=1;
            }
            if(s==1) //有序
            {
                printf("Sorted sequence determined after %d relations: ",i);
                for(int j=0;j<n;j++)
                    printf("%c",q[j]+‘A‘-1);
                printf(".\n");
                sign=1;
            }
        }
        if(!sign) //不确定
            printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
时间: 2024-10-22 15:44:51

poj 1094 拓扑排序的相关文章

Poj 1094 拓扑排序 水题

Sad..这么水的题WA了无数发,题目要看仔细啊,留下来做个警告把 #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #i

poj 4084:拓扑排序

poj 4084:拓扑排序 很好的题目,恶心的算法 描述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前. 输入 若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号. v<=100, a<=500 输出 若干个空格隔开的顶点构成的序列(用小写字母). 样例输入 6 8 1 2 1 3 1 4 3 2 3 5 4 5 6 4 6 5 样例输出 v1 v3 v2 v6 v4 v5 解题方案 显然这是有向图,然

poj 2367 拓扑排序

题目链接:http://poj.org/problem?id=2367 题目大意:就是进行拓扑排序,先给你一个数n,代表1~n,对于每个数有一系列的指向,最后将这些数进行排列出来..就是简单的拓扑排序. 首先拓扑排序应该有两种实现的方法.. 一种是用dfs进行每个节点的搜索,最后进行回溯,这样的话很容易就能明白先找出来的应该是后面的数,而最后找出来的应该是之前的数,因为是回溯出来的嘛..所以可以使用一个栈来进行答案的存储,因为栈的特性就是后压入的先弹出. dfs实现的思想:利用一个数组来存储每个

POJ 3249 拓扑排序+DP

貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中呢.遇见了这样一个问题.有n个城市,m条小道.然后要从入度为0的点出发,出度为0的点结束,中途经过的城市呢,都是要付费的.负数表示花费.正数表示收益.然后让你求收益最大或者说花费最少的总值. 貌似.BFS和DFS都会超时.不妨一试.附代码: #include<stdio.h>#include<

poj 3687 拓扑排序

Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that: No two balls share the same label. The labeling satisfies several constrains like "The ball labeled with a is lighter

[ACM] POJ 1094 Sorting It All Out (拓扑排序)

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26801   Accepted: 9248 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 sm

POJ 1094 Sorting It All Out【floyd传递闭包+拓扑排序】

Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31994 Accepted: 11117 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 small

poj 1094 Sorting It All Out (拓扑排序)

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27929   Accepted: 9655 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 sm

POJ 1094 Sorting It All Out(拓扑排序&#183;判断+实现)

题意  由一些不同元素组成的升序序列是可以用若干个小于号将所有的元素按从小到大的顺序 排列起来的序列.例如,排序后的序列为 A, B, C, D,这意味着 A < B.B < C和C < D.在本题中, 给定一组形如 A < B的关系式,你的任务是判定是否存在一个有序序列. 输出到哪一项可以确定顺序或者在这一项最先出现冲突,若所有的小于关系都处理完了都不能确定顺序也没有出现冲突,就输出不能确定 每来一个小于关系就进行一次拓扑排序  直到出现冲突(也就是出现了环)或者已经能确定顺序