Sorting It All Out

Time Limit: 1000MS Memory Limit: 10000K

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.


解题心得:

  • 题意就是给你一系列的关系,让你从他给出的关系中从小到大排一个序,如果给出的关系中发生冲突,输出发生冲突的那一步,如果可以得到一个序,输出题目给出到第几个关系才能确定顺序。
  • 其实就是给出一个关系,然后拓扑排序判断一下,因为最多只有26个字母,所以怎么写都不会超时。如果题目给出的关系发生冲突,那么必然可以形成环,所以判断环就行,如果能够确定n个点的关系,那么每次只能出现一个出度为0的点,最后n个点的顺序全得到。思路比较简单,只要不手贱写一些BUG那么还是很容易用代码实现的。

#include<stdio.h>
#include<algorithm>
#include<set>
#include<stack>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 100;
char s[maxn];
vector <int> ve[maxn];//用不定长数组来存储边的关系
int out[maxn],n,m;
bool vis[maxn],maps[maxn][maxn];
int ans;
stack <int> st1;
void init()
{
ans = -1;
for(int i=0; i<maxn; i++)
ve[i].clear();
memset(out,0,sizeof(out));
memset(maps,0,sizeof(maps));
memset(vis,0,sizeof(vis));
} int toposort(int pos)
{
maps[s[0]][s[2]] = true;
vis[s[0]] = vis[s[2]] = true;//已经出现了的点
out[s[0]]++;//出度++
ve[s[2]].push_back(s[0]);
int in1[maxn],out1[maxn];
bool vis1[maxn];
memcpy(out1,out,sizeof(out));
memcpy(vis1,vis,sizeof(vis));
stack<int>st;
bool flag = false;
while(1)
{
int num = 0;
vector<int>va;
for(int i='A'; i<'A'+n; i++)
{
if(out1[i] == 0 && vis1[i])//出度为零并且已经出现了的点
va.push_back(i);
}
if(va.size() > 1)//出度为0的点不止一个做好标记
flag = true;
if(va.size() == 0)//没有出度为0的点了
break; for(int i=0; i<va.size(); i++)//根据拓扑排序来解决这个出度为0的点
{
int k = va[i];
st.push(k);
vis1[k] = false;
for(int j=0;j<ve[k].size();j++)
out1[ve[k][j]]--;
}
}
int sum2 = 0;
for(int i='A'; i<'A'+n; i++)//检查是否出现了环
if(out1[i])
sum2++;
if(sum2 != 0)
{
//如果有环记录出现环的步数,然后直接返回
ans = pos;
return 2;
}
if(flag)//出现了多个入度为零的点
return 1;
if(st.size() == n)//找到了n个符合拓扑排序的点
{
ans = pos;
st1 = st;
return 3;
}
return 1;//给出的关系不够不能得出答案
} int main()
{
while(scanf("%d%d",&n,&m) && n+m)
{
init();//初始化一些数组
bool cont_flag = false;//是否已经出现结果
int k;
for(int i=1; i<=m; i++)
{
scanf("%s",s);
if(cont_flag)
continue;
if(maps[s[0]][s[2]])//去除重边
continue; k = toposort(i);
if(k == 2)
cont_flag = true;
if(k == 3)
cont_flag = true;
}
if(k != 3 && k != 2)//没找到答案也未出现环,说明给出的关系不足以判断
printf("Sorted sequence cannot be determined.\n");
if(k == 2)
printf("Inconsistency found after %d relations.\n",ans);
if(k == 3)
{
printf("Sorted sequence determined after %d relations: ",ans);
while(st1.size())
{
printf("%c",st1.top());
st1.pop();
}
printf(".\n");
}
}
return 0;
}

POJ:1094-Sorting It All Out(拓扑排序经典题型)的更多相关文章

  1. ACM: poj 1094 Sorting It All Out - 拓扑排序

    poj 1094 Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & ...

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

    http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  3. [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  4. POJ 1094 Sorting It All Out (拓扑排序) - from lanshui_Yang

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  5. poj 1094 Sorting It All Out_拓扑排序

    题意:是否唯一确定顺序,根据情况输出 #include <iostream> #include<cstdio> #include<cstring> #include ...

  6. POJ 1094 Sorting It All Out 拓扑排序 难度:0

    http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...

  7. PKU 1094 Sorting It All Out(拓扑排序)

    题目大意:就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列. 是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.判断该序列是否唯一: 3.该序列字母次序之间 ...

  8. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

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

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

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

随机推荐

  1. RTC-IC-PCF2129

    一特点: -20~70度,SPI/I2C接口,1.2 V to 4.2 V ,可编程看门狗,时钟输出以便校准,闹钟输出,时间戳输出.低功耗高精度,电源切换,中断输出. SPI接口和I2C接口硬件接法: ...

  2. Zepto事件模块源码分析

    Zepto事件模块源码分析 一.保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数.而Zepto则可以不传入回调函数,直接移除对应类型的所有事件.原因就在于Z ...

  3. HandlerMapping执行过程。。。

    1.web.xml DispatcherServlet 类 寻址 doDispatch() 2.getHandler(requset) 点击,进入 3.HandlerMapping hm=xxxxxx ...

  4. [转]使用 HTML5 WebSocket 构建实时 Web 应用

    HTML5 WebSocket 简介和实战演练 本文主要介绍了 HTML5 WebSocket 的原理以及它给实时 Web 开发带来的革命性的创新,并通过一个 WebSocket 服务器和客户端的案例 ...

  5. Eclipse 主题(Theme)配置

    < 程序员大牛必备的装逼神器 > 一个牛逼的程序员,除了有牛逼的技术,还要有高逼格的风格,说白了,就和人一样,单是内在美还不行,必须外表也要美,就好比,一个乞丐,他内在美,但是全身臭气熏天 ...

  6. 洛谷P2062 分队问题(dp)

    题意 题目链接 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. So ...

  7. linux命令行—《命令行快速入门》

    pwd print working directory 打印工作目录 hostname my computer's network name 电脑在网络中的名称 mkdir make director ...

  8. win7 dos窗口模拟帧刷新

    前几天是白色情人节,临时脑抽写了个表白神器 高端大气上档次,就是不知道该送给谁,经过两天的反射弧思考决定还是写给博客娘吧.- -~ 这个程序就是打开后,在Dos窗口内模拟写出几行字母.其实主要就是模拟 ...

  9. 【LeetCode】9 Palindrome Number 回文数判定

    题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...

  10. python基础教程总结7——异常

    1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有: 异常 描述 NameError 尝试访问一个没有申明的变量 ZeroDivisionError ...