POJ1094[有向环 拓扑排序]

Sorting It All Out

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 33184   Accepted: 11545

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.

Source

East Central North America 2001


因为要求几个relation,所以没加一个进行一次topoSort

一旦遇到有环或者唯一有序就sign=1,后面的关系一定要读完(后果自负),如果最后sign==0说明没确定顺序

要打印方案,可以用char  topo[]来保存,然而输出topo[]比一个个输出慢了16MS,并且还忘初始化了WA好几次

//
//  main.cpp
//  poj1094
//
//  Created by Candy on 9/11/16.
//  Copyright © 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=30;
int n,m,ind[N],ch[N][N];
char tmp[5],topo[N];
int q[N];
int topoSort(){
    int flag=2;//only sorted
    int indt[N];
    for(int i=1;i<=n;i++) indt[i]=ind[i];
    for(int i=1;i<=n;i++){//printf("%d %d %d \n",i,ind[i],ch[i][0]);
        int zero=0,u=0;
        for(int j=1;j<=n;j++) if(indt[j]==0) zero++,u=j;
        if(zero==0) return 1;//circle
        if(zero>1) flag=3;//no sorted
        indt[u]--;
        topo[i-1]=(char)u+‘A‘-1;
        q[i-1]=u;
        for(int j=1;j<=ch[u][0];j++)
            indt[ch[u][j]]--;
    }
    return flag;
}
int main(int argc, const char * argv[]) {
    while(cin>>n>>m){
        if(n==0&&m==0) break;
        memset(ch,0,sizeof(ch));
        memset(ind,0,sizeof(ind));
        memset(topo,0,sizeof(topo));
        int sign=0;

        for(int i=1;i<=m;i++){
            scanf("%s",tmp);
            if(sign) continue;
            int x=tmp[0]-‘A‘+1,y=tmp[2]-‘A‘+1;
            ind[y]++;
            ch[x][++ch[x][0]]=y;
            int flag=topoSort();
            if(flag==1){sign=1;printf("Inconsistency found after %d relations.\n",i);}
            if(flag==2){
                sign=1;printf("Sorted sequence determined after %d relations: %s.\n",i,topo);
//                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-11-19 05:18:04

POJ1094[有向环 拓扑排序]的相关文章

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

【图论】拓扑排序应用

拓扑排序虽是一种排序,但是它跟平时所接触的sort或者qsort不同,排序的意义不同.拓扑排序针对有向无回路图(DAG)而言的,不应用与存在回路的有向图. [图论]广度优先搜索和深度优先搜索 有说到了BFS和DFS,拓扑排序是DFS的一个应用. 有向无回路图能说明事件的发生的先后的顺序.比如穿衣服,士兵排队等.一个具体的例子,有N个物体,下面给出物体的重量比较,比如(a,b)表示a比b重等等,问已给出的条件是否会矛盾?其实就是判断用所给条件所组织的一个图中是否会存在环? 在DFS中加入时间戳,完

[LeetCode] 207. 课程表(拓扑排序,BFS)

题目 现在你总共有 n 门课需要选,记为?0?到?n-1. 在选修某些课程之前需要一些先修课程.?例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1: 输入: 2, [[1,0]] 输出: true 解释:?总共有 2 门课程.学习课程 1 之前,你需要完成课程 0.所以这是可能的. 示例 2: 输入: 2, [[1,0],[0,1]] 输出: false 解释:?总共有 2 门课程

nyoj349 poj1094 Sorting It All Out(拓扑排序)

nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=1094这两个题是一样的,不过在poj上A了才算真的过,ny上数据有一点弱. 题目大意输入n,m. 一共有n个字母(从A开始), m行语句每个语句“x﹤y”,说明x,y之间的偏序关系.让你判断是否可以通过这些关系得到一个唯一的升序序列,若能则输出这个序列并指出通过前多少条语句得出的,如果n个字母间存在矛

POJ1094 拓扑排序

问题:POJ1094 本题考查拓扑排序算法 拓扑排序: 1)找到入度为0的点,加入已排序列表末尾: 2)删除该点,更新入度数组. 循环1)2)直到 1. 所有点都被删除,则找到一个拓扑排序: 2. 或剩余结点中没有入度为0的点,则原图中必存在环. 本题算法 1.依次输入一组关系 对当前关系进行拓扑排序 1)若存在环,则无法排序 2)若根据当前关系,每次循环都唯一的确定入度为0的点,则存在排序 2.若输完所有的大小关系之后,仍然没有确定大小排序,也没有发现回环,则排序无法唯一确定 AC代码: 1

POJ1094拓扑排序

每次输入的时候 进行一次 拓扑排序. 拓扑排序时,每次查找入度为零的点只有一个,则此解为确定解.若找到确定解之后出现环(坑),继续输入,不管它. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include &

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3566    Accepted Submission(s): 1395 Problem Description Recently, scientists find that there is love between any of two people. For

有向无环图的应用—AOV网 和 拓扑排序

有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林. 在工程计划和管理方面的应用 除最简单的情况之外,几乎所有的工程都可分为若干个称作“活动”的子工程,并且这些子工程之间通常受着一定条件的约束,例如:其中某些子工程必须在另一些子工 程完成之后才能开始.对整个工程和系统,人们关心的是两方面的问题: 一是工程能否顺利进行,即工程流程是否“合理”: 二是