Description:
      规定对于一个只有大写字母的字符串是有大小顺序的。如ABCD.即A<B。B<C。C<D。那么问题来了。现在第一行给你n, m代表序列里只会出现前n的大写字母、以后的第2到m行给你m组。有三个字符。即“第一个字符” “<”"第二个字符"...请你给出答案。在第几组之后确定了排列顺序或者第几组之后出现矛盾。还是直到输入结束也没有排列顺序也没有出现矛盾。

思路很简单、就是把前n个字符转换成0~n-1的数字。然后,,每次输入都要拓扑一次。如果出现了固定顺序或者矛盾。以后就可以只输有输入操作了。如果直到最后这两种情况都没有出现的话。就是无法确定。

附代码:WA了好久。。仍然有地方不懂。。但是是人家自己敲得啦,,,~~~~(>_<)~~~~

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;

int map[27][27];
int degree[27];
int top[27];
int tot;
int n, m;
queue<int>q;

void init()
{
    tot = 0;
    memset(map, 0, sizeof(map));
    memset(degree, 0, sizeof(degree));
    memset(top, 0, sizeof(top));
}

int topsort()
{
    int l = 0;
    int flag = 0;
    while(!q.empty())
        q.pop();
    int dd[30];
    memcpy(dd, degree, sizeof(degree));
    for (int i=0; i<n; ++i)
    {
        if (dd[i] == 0)
        {
            q.push(i);
        }
    }
    while(!q.empty())
    {
        if (q.size() > 1)
           flag = 1;
        int k = q.front();
        q.pop();
        top[l++] = k;
        for (int i=0; i<n; ++i)
        {
            if (map[k][i] == 1)
               {
                   if (--dd[i] == 0)
                    q.push(i);
               }
        }
    }
    if (l != n)
        return 2;
    else if (flag == 1)
        return 1;
    // T_T 为什么必须先判断是不是有矛盾。再判断是不是无法确定呢。也就是。有时候同时有两个入度为0的点。并不能说明就是无法判断。
    //所以不能在flag == 1处。改为直接return 1.....
    
//      if (flag == 1)
//        return 1;
//      else if (l != n)
//        return 2;
    return 0;
}
int main()
{
    char a, b, temp;
    int i, j;
    int aa, bb;
    int mao, que;
    int now = 0;
    while(cin >> n >> m)
    {
        init();
        if (n == 0 && m == 0)
            break;
        mao = 0;
        que = 0;
        now = 0;
        for (i=0; i<m; ++i)
        {
            cin >> a >> temp >> b;
            now++;
            if (!mao && !que)
            {
                if (map[b-'A'][a-'A'] == 1)
                {
                    mao = 1;
                    cout << "Inconsistency found after " << now <<  " relations.\n";
                    continue;
                }
                if (map[a-'A'][b-'A'] == 0)
                {
                    map[a-'A'][b-'A'] = 1;
                    degree[b-'A']++;
                }
               int res = topsort();
                if (res == 0)
                {
                    cout << "Sorted sequence determined after " << now << " relations: ";
                    for (int j=0; j<n; ++j)
                    {
                        cout << char(top[j] + 'A');
                    }
                    cout << ".\n";
                    que = 1;
                }
                else if (res == 2)
                {
                    cout << "Inconsistency found after " << now <<  " relations.\n";
                    mao = 1;
                }
            }
        }
        if (!mao && !que)
        {
            cout << "Sorted sequence cannot be determined.\n";
        }
    }
    return 0;
}

POJ 1094 拓扑排序的更多相关文章

  1. Sorting It All Out POJ - 1094 拓扑排序

    题意:给N个字母,和M个偏序关系 求一个可确定的全序,可确定是指没有其他的可能例如A>B D>B 那么有ADB DAB两种,这就是不可确定的其中,M个偏序关系可以看做是一个一个按时间给出的 ...

  2. nyoj 349 (poj 1094) (拓扑排序)

    Sorting It All Out 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 An ascending sorted sequence of distinct ...

  3. poj 3687(拓扑排序)

    http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...

  4. POJ 3249 拓扑排序+DP

    貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...

  5. poj 3249 拓扑排序 and 动态规划

    思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解. #include<iostream> #include& ...

  6. poj 2585 拓扑排序

    这题主要在于建图.对9个2*2的小块,第i块如果出现了不等于i的数字,那么一定是在i之后被brought的.可以从i到该数字建一条边. 图建好后,进行一次拓扑排序,判段是否存在环.若存在环,那么就是B ...

  7. Poj(3687),拓扑排序,

    题目链接:http://poj.org/problem?id=3687 题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号 ...

  8. POJ 1128 拓扑排序 + 深搜

    /* (⊙v⊙)嗯 貌似是一个建图 拓扑+深搜的过程.至于为什么要深搜嘛..一个月前敲得题现在全部推了重敲,于是明白了.因为题意要求如果有多个可能的解的话. * 就要输出字典序最小的那个.所以可以对2 ...

  9. poj 2367 拓扑排序入门

    Description The system of Martians' blood relations is confusing enough. Actually, Martians bud when ...

随机推荐

  1. lotus 公式

    函数 描述@UserName 返回用户名或服务器名.@Name([key]; name) 更改用户名的格式.关键字包含 [CN] 以从一个专有名字中解析出公共名,[Abbreviate] 缩写规范格式 ...

  2. 删除List中制定的值的方法

    /** * * @param args */ public static void main(String[] args) { List<String> list = new ArrayL ...

  3. 四十条测试你是不是合格的PHP程序员

    四十条测试你是否合格的PHP程序员,不官方,也不权威,但很给力.超过三条就不合格了.超过五条就得好好反省下自己的不足了. 1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成 ...

  4. for循坏的穷举与迭代,while、do while循环

    for循环的穷举:所有情况走一遍,使用if筛选出符合的情况. 单位发一张150元购物卡,到超市买三种洗化用品,洗发水15元,香皂两元,牙刷5元,刚好花完150元,有多少种买法,每种买法各买几样. 百鸡 ...

  5. hdu 1575 Tr A(矩阵快速幂)

    今天做的第二道矩阵快速幂题,因为是初次接触,各种奇葩错误整整调试了一下午.废话不说,入正题.该题应该属于矩阵快速幂的裸题了吧,知道快速幂原理(二进制迭代法,非递归版)后,剩下的只是处理矩阵乘法的功夫了 ...

  6. Spring集成JPA提示Not an managed type

    在做Spring与JPA集成时,出现问题如下: Caused by: java.lang.IllegalArgumentException: Not an managed type: class co ...

  7. hiho1093_spfa

    题目 SPFA模板题,题目中数据可能有两个点之间有多条边直接相连,使用 unordered_map< int, unordered_map< int, int>>, 来存储图的 ...

  8. markdown 语法学习

    markdown是一种轻量级的标记语言,和html类似,但是易读性比html要好很多. 基本语法: 1.标题和正文分隔线 === //至少三个连续等号,最高阶标题 --- //或者三个连续的减号,第二 ...

  9. grub4dos通用菜单及相关工具包

    grub4dos通用菜单及相关工具包 全套工具包(含PE.ISO,可根据需要替换删减):http://pan.baidu.com/s/1i4EjWod模板文件3.3M(不含PE.ISO):http:/ ...

  10. 5-2-2 printf参数从右往左压栈

    5-2-2 C中printf计算参数时是从右到左压栈的 #include <stdio.h> int main (int argc, char **argv) { ; ,,,,}; int ...