poj1094(去环)(唯一确定)topu排序

Sorting It All Out

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 31940   Accepted: 11103

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.

一年前做过,当时没什么想法,只是照别人用floyd来判断环,现在做这题的想法是用Targan来判断强连通分量(环),排除环以后,再拓扑来能否唯一确定判断先修关系唯一的意思是a->b a->c c->d ,那么b和c的关系就不能判断了所以每一次判断indegree时,只要判断in==0 是否唯一但是本题有点恶心吧,题意要求输出能进行判断时的关系数量,表达不清楚额,,,所以每一步都要用拓扑来确定有没有单一关系,然后每一步都要进行Targan去掉环,感觉很麻烦的样子

后来看了别人的代码,发现直接用topu就能判断有没有环了,思路非常清晰我们可以很容易发现,每一次进行topu判断时,只要不存在in == 0的结点,那么必然存在环,存在多个in==0的结点,那么说明此图不是唯一确定的

注意点:此题只要发现存在唯一确定,或者存在矛盾(也就是环),就会直接得到条件,换句话说,此题就是用最小的关系确定是否唯一确定,还是矛盾特例是,前面唯一确定了,后面还是有矛盾,按此题的意思是不管后面的,因为前面先确定唯一了非常经典的(排除环的)(唯一确定)的topu排序RT


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int inf = 0x3f3f3f;
const int MAXN= 26;
const int MAXNN = 1e5+10;

int in[MAXN];
int tmp[MAXN];
int G[MAXN][MAXN];
int ans[MAXN];
int n,m,flag,signal;
int top;

void init(){
    flag= 1;
    signal = 0;
    memset(G,0,sizeof(G));
    memset(tmp,0,sizeof(tmp));
    memset(in,0,sizeof(in));
}

void tupoSort(){
    int sum,x;
    top=0;
    for(int i=0;i<n;i++){
        tmp[i] = in[i];
    }
    for(int i=0;i<n;i++){
        sum = 0;
        for(int j=0;j<n;j++){
            if(tmp[j]==0){
                sum++;
                x = j;
            }
        }
        if(sum==0){
            flag = -1;
            return;
        }

        if(sum>1){
            flag = 0;
        }

        tmp[x] = -1;
        ans[top++] = x;

        for(int j=0;j<n;j++){
            if(G[x][j]){
                tmp[j]--;
            }
        }
    }
    //flag = 2;
}

int main(){
    char ts[5];
    int a,b,w;
    while(scanf("%d%d",&n,&m),n){
        init();
        for(int i=0;i<m;i++){
            scanf("%s",ts);
            a = ts[0]-‘A‘;
            b= ts[2]-‘A‘;
            if(!G[a][b]){
                in[b]++;
                G[a][b] = 1;
            }
            else{
                continue;
            }
            if(signal)continue;
            flag = 1;
            tupoSort();
            if(flag==-1||flag==1){
                w = i+1;
                signal = 1;
            }
        }

        if(flag==0)
            printf("Sorted sequence cannot be determined.\n");
        else if(flag==-1)
            printf("Inconsistency found after %d relations.\n",w);
        else {
            printf("Sorted sequence determined after %d relations: ",w);
                for(int i=0;i<top;i++){
                    printf("%c",ans[i]+‘A‘);
                }
                cout<<"."<<endl;
        }
    }
}

时间: 2024-10-10 11:16:22

poj1094(去环)(唯一确定)topu排序的相关文章

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个字母间存在矛

47. 蛤蟆的数据结构笔记之四十七的有向无环图的应用排序

47.蛤蟆的数据结构笔记之四十七的有向无环图的应用排序 本篇名言:"君子喻于义 ,小人喻于利. -- 孔丘" 接下去来看下有向无环图. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47110397 1.  有向无环图 一个无环的有向图称做有向无环图(directedacycline praph).简称DAG图.DAG 图是一类较有向树更一般的特殊有向图,图1给出了有向树.DAG图和有向图 有向无环图是描述含有公共

有向无环图(DAG)拓扑排序的两种方法

如下图的DAG: 第一种: (1)从AOV网中选择一个没有前驱的顶点并且输出它: (2)从AOV网中删除该顶点,并且上去所有该顶点为尾的弧: (3)重复上述两步,直到全部顶点都被输出,或者AOV网中不存在没有前驱的顶点. 第二种: 使用深度优先搜索(DFS),并标记每一个节点的第一次访问(pre)和最后一次访问时间(post),最后post的逆序就是DAG的拓扑排序,其实也是节点在进行DFS搜索时,出栈的逆序就是拓扑排序. 拓扑序列的结果有: (1) c++,高等数学,离散数学,数据结构,概率论

POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断

题目链接: https://vjudge.net/problem/POJ-1094 题目大意: 该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.该序列不能判断是否有序(序列不唯一): 3.该序列字母次序之间有矛盾,即有环存在. 思路: 这里应该用Kahn算法拓扑排序 每加入一条边需要进行一次拓扑排序,如果拓扑排序发现有环,或者排序唯一那么就可以直接输出结果,如果所有的边输入完成还不是上述

数据结构与算法——有向无环图的拓扑排序C++实现

拓扑排序简介: 拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从Vi到Vj的路径,那么在排序中Vi在Vj的前面. 如果图中含有回路,那么拓扑排序是不可能的.此外,拓扑排序不必是唯一的,任何合理的排序都可以. 对于上面的无环图:v1,v2,v5,v4,v3,v7,v6和v1,v2,v5,v4,v7,v3,v6都是合理的拓扑排序. 一个简单的求拓扑排序的思路: 1.先找出任意一个没有入边的顶点 2.然后显出该点,并将它和它邻接的所有的边全部删除. 3.然后,对图中其它部分做同样的处理.

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

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

POJ1094 Sorting It All Out 拓扑排序(深搜)

题意:给定n和m,n表示大写字母的前n个,m表示m个关系对,求能否确定唯一排序. 分析:分三种情况 (1)当输入完当前的关系对之后,已经能确定矛盾(不需要完全输入m个关系对时) eg. 3 3       A<B       B<A         B<C       当输入到第二对已经能判断矛盾,此时记下当前的所需要用到的关系对数ans=2:       接着输入,但是后面的关系对不作处理 (2) 当输入完当前的关系对之后,已经能确定唯一排序(不需要完全输入m个关系对,    但是必须

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

POJ1094 拓扑排序

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