Sorting It All Out
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 29539   Accepted: 10233

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

网上讲解参考代码

/**  这道题WA了好久,其中有几个需要注意的地方
1、当出现正好存在一种情况能够排序完所有节点时,不管以后的边会出现什么情况,都输出
    能够排序成功
2、当中间的拓扑排序过程中出现多个几点的入度为0时,只记录当时的状态
    (亦即该测试数据要么出现环,要么就是有多组解),不能立即返回,
    要继续读边,直到能够排序完成(此时输出有多解的情况)或者出现环。
*/
#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

bool G[30][30];
int d[30];
char s[30];
int n;
int toposort()
{
    int num,k,i,j,t;
    int td[30];
    bool flag1=true;
    for(i=1;i<=n;++i)
        td[i]=d[i];
    memset(s,0,sizeof(0));
    for(j=0;j<n;++j)
    {
        num=0;
        for(i=1;i<=n;++i)
        {
            if(td[i]==0)
            {
                k=i;
                ++num;
            }
        }
        if(num==0)    //有环
            return -1;
        if(num>1)  //有多种情况,还需继续读边判断
        {
            flag1=false;
        }
        s[j]='A'+k-1;
        td[k]--;
        for(t=1;t<=n;++t)
        {
            if(G[k][t])
                --td[t];
        }
    }
    s[n]='\0';
    if(flag1==false)  //情况不唯一
        return 0;
    return 1;      //全部排好序了返回1.
}

int main()
{
    int m,i,ans,k;
    bool flag;
    char temp[5];
    while(scanf("%d%d",&n,&m),m||n)
    {
        memset(G,false,sizeof(G));
        memset(d,0,sizeof(d));
        flag=true;
        for(i=1;i<=m;++i)
        {
            scanf("%s",temp);
            if(!flag)         //已经排好序或者有环
                continue;
            int u=temp[0]-'A'+1;
            int v=temp[2]-'A'+1;
            if(!G[u][v])
            {
                ++d[v];
                G[u][v]=true;
            }
            ans=toposort();
            if(ans==1||ans==-1)
            {
                k=i;
                flag=false;
            }
        }
        if(ans==1)
        {
            printf("Sorted sequence determined after %d relations: %s.\n",k,s);
        }
        else if(ans==-1)
        {
            printf("Inconsistency found after %d relations.\n", k);
        }
       else if(flag)
            printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
}

我的代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int map[100][100];
int m,n;
int tindegree[100],indegree[100];
char str[5];
char s[39];
int toposort(){
     bool flag=true;
     memset(tindegree,0,sizeof(tindegree));
     memset(s,0,sizeof(s));
     for(int i=1;i<=n;i++){
     tindegree[i]=indegree[i];
     }
    for(int i=1;i<=n;i++){
        int sum=0,k;
           for(int j=1;j<=n;j++){
               if(!tindegree[j]){
                    k=j;
                    sum++;
               }
           }
           if(sum==0){
              return -1;
           }
           if(sum>1){
                flag=false;
           }
        s[i-1]=k+'A'-1;
        tindegree[k]--;
        for(int z=1;z<=n;z++){
            if(map[k][z]){
                 tindegree[z]--;
            }
        }

}
    s[n]='\0';
    if(flag==false)
    return 0;
    return 1;
}
int main(){
     while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0)
           break;
          memset(map,0,sizeof(map));
          memset(indegree,0,sizeof(indegree));
          memset(str,0,sizeof(str));
          memset(s,0,sizeof(s));
          int ans=2;
          int temp;
           bool flag=true;
          for(int i=1;i<=m;i++){
              scanf("%s",str);
              if(flag==false)
              continue;
              int u=str[0]-'A'+1;
              int v=str[2]-'A'+1;
              if(!map[u][v]){
                 map[u][v]=1;
                 indegree[v]++;
              }
             ans=toposort();
             if(ans==-1||ans==1){
                 temp=i;
                 flag=false;
             }
          }
          if(ans==1)
          printf("Sorted sequence determined after %d relations: %s.\n",temp,s);//temp不可以改为n
          else  if(ans==-1)
          printf("Inconsistency found after %d relations.\n",temp);
          else  if(flag)
          printf("Sorted sequence cannot be determined.\n");

}
    return 0;
}

poj1094的更多相关文章

  1. POJ1094[有向环 拓扑排序]

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33184   Accepted: 11 ...

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

    nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=10 ...

  3. POJ1094 拓扑排序

    问题:POJ1094   本题考查拓扑排序算法   拓扑排序:   1)找到入度为0的点,加入已排序列表末尾: 2)删除该点,更新入度数组.   循环1)2)直到 1. 所有点都被删除,则找到一个拓扑 ...

  4. [poj1094]Sorting It All Out_拓扑排序

    Sorting It All Out poj-1094 题目大意:给出一些字符串之间的大小关系,问能否得到一个唯一的字符串序列,满足权值随下标递增. 注释:最多26个字母,均为大写. 想法:显然,很容 ...

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

    题目链接: https://vjudge.net/problem/POJ-1094 题目大意: 该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上 ...

  6. POJ1094——拓扑排序和它的唯一性

    比较模板的topological-sort题,关键在于每个元素都严格存在唯一的大小关系,而一般的拓扑排序只给出一个可能解,这就需要每趟排序的过程中监视它是不是总坚持一条唯一的路径. 算法导论里面的拓扑 ...

  7. poj1094 拓扑 Sorting It All Out

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29744   Accepted: 10 ...

  8. poj1094 拓扑序

    题意:现在有多个大写字母(不一定连续),给出字母之间的大小关系,问到第几个关系时就能判断有唯一大小排序或出现矛盾,或是有多个合理排序,若有唯一排序,则输出它. 拓扑序,只不过坑爹的是如果关系处理到一半 ...

  9. poj1094 topsort

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32275   Accepted: 11 ...

随机推荐

  1. Boostrap(1)

    1.简介 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,可以认为bootstrap就是一个样式库. ...

  2. Javascript基础系列之(三)数据类型 (字符串 String)

    javascript一共有9种数据类型 字符串 String 数值型 Number 布尔型 Boolean 未定义 Undefine 空值 Null 对象 Object 引用Refernce 列表型 ...

  3. 团队项目作业第二项:利用NABCD模型进行竞争性需求分析

    项目需求分析与建议--NABCD模型(王鲁跃负责) N (Need 需求) 对于现在的学生来说,我们认为打字是很重要的.不管在什么方面都需要进行电脑打字,例如文员.QQ.MSN.制作,论文等等,都需要 ...

  4. 并行程序设计模式--Master-Worker模式

    简介 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负责处理子任务 ...

  5. 用form表单实现Ajax---post提交

    实例讲解:新闻发布实现无刷新上传,显示 html代码: 注意:文本框中并没有id  ,,只有name.jquery获取每个文本框的值还要在拼写提交格式(id=value&name=value& ...

  6. Spring 配置文件applicationContext.xml

    Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸". Spring配置文件是一个或多个标准的XML文档,applica ...

  7. 【ZOJ 3502】Contest

    题 题意 n个问题,解决的顺序影响正确的概率,无论之前解决的问题是否答对,当前问题 j 答对概率为max{a[i][j]} (i为解决过的问题).求答对题目的最大期望和对应的答题顺序.T组测试,T ( ...

  8. 【CodeForces 624C】Graph and String

    题 题意 n个表示abc三个字符的点,所有a和b是相连的,所有b和c是相连的,所有相同的是相连的,现在给你n个点和他们之间的m条边,判断是否存在这样的字符串,存在则给出一个符合条件的. 分析 我的做法 ...

  9. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法

    逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...

  10. NYOJ298点的转换(矩阵十大问题之一)

    点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作: 平移一定距离(M),相对X ...