Sort it all out
poj1094:http://poj.org/problem?id=1094
题解(一位大神的分析)
一、当输入的字母全部都在前n个大写字母范围内时:
(1)最终的图 可以排序: 在输入结束前如果能得到最终的图(就是用这n个字母作为顶点,一个都不能少);而且最终得到的图 无环;
只有唯一一个 无前驱(即入度为0)的结点,但允许其子图有多个无前驱的结点。在这步输出排序后,不再对后续输入进行操作
(2)输出矛盾:在输入结束前如果最终图的子图有环, 在这步输出矛盾后,不再对后续输入进行操作
(3)输出无法确认排序:这种情况必须全部关系输入后才能确定,其中又有2种可能
①最终图的字母一个不缺,但是有多个 无前驱结点
②输入结束了,但最终的图仍然字母不全,与 无前驱结点 的多少无关
二、当输入的字母含有 非前n个大写字母 的字母时(超出界限):
(1)输出矛盾:输入过程中检查输入的字母(结点),若 前n个大写字母 全部出现,则在最后一个大写字母出现的那一步 输出矛盾
(2)输出无法确认排序:最后一步输入后,前n个大写字母 仍然未全部出现,则输出 无法确认排序
PS:在使用“无前驱结点”算法时必须要注意,在“矛盾优 先”的规律下,必须考虑一种特殊情况,就是多个无前驱结点与环共存时的情况,即输入过程中子图都是有
多个无前驱结点,最后一步输入后出现了环,根据算法的特征,很容易输出“不能确认排序”,这是错的,必须适当修改算法,输出“矛盾”。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int counts[];
int temp[];
char relation[];
char seq[];
bool alpha[];
int n,m;
vector<vector<char> >v;
int topsort(int s){
int i,j,r,cnt;
bool flag;
r=,cnt=;
for( i=;i<n;i++)
temp[i]=counts[i];
flag=;
while(s--){
cnt=;
for( i=;i<n;i++){
if(temp[i]==){
j=i;cnt++;
}
}
if(cnt>=){
if(cnt>)flag=;
for( i=;i<v[j].size();i++)
temp[v[j][i]]--;
seq[r++]=j+'A';
temp[j]=-;seq[r]=;
}
else if(cnt==)return -;
}
if(flag){return r;}
else
return ;
}
int main(){
int i,j,t,k,c;
int determined;char ss[];
while(~scanf("%d%d",&n,&m)&&n&&m){
memset(counts,,sizeof(counts));
memset(alpha,false,sizeof(alpha));
v.clear();
v.resize(n);
c=;determined=;
for(i=;i<m;i++){
scanf("%s",relation);
counts[relation[]-'A']++;
v[relation[]-'A'].push_back(relation[]-'A');
if(!alpha[relation[]-'A']){
c++;alpha[relation[]-'A']=true;
}
if(!alpha[relation[]-'A']){
c++;alpha[relation[]-'A']=true;
}
if(determined==){
t=topsort(c);
if(t==-){
determined=-;k=i+;
}
else if(t==n){
determined=;k=i+;
strcpy(ss,seq);
}
}
} if(determined==-)
printf("Inconsistency found after %d relations.\n",k);
else if(determined==)
printf("Sorted sequence cannot be determined.\n");
else{
printf("Sorted sequence determined after %d relations: %s.\n",k,ss);
} }
}
Sort it all out的更多相关文章
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- shell之sort命令
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- js sort() reverse()
数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 2.sort 排序命令讲解
sort命令 sort:文本排序,仅仅是对显示文件的排序,而不影响源文件的顺序,是根据ASSII码 的字符升序来排列的. -n:安装数值大小从小到大排列 ,默认是升序. ...
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ...
- 快速排序算法 quick sort的理解
最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来, ...
随机推荐
- Memo打印1
Delphi 打印Memo里面的内容 实现的功能和记事本的打印的功能一样 打印保存为文件时此时的文件名如何设置? 当Memo里的文本数量巨大时 窗体正在打印会出现点数字显示问题 闪 ...
- alloc、init你弄懂50%了吗?
前言 这是一篇我记录对alloc.init分析思考的笔记.如果读者想看懂我的第二个思考,可能需要您至少了解内存的分段分页管理,如果您对其一点都不知道,可以先看这篇软文简单了解一下.另外很重要的一点是, ...
- GRADLE 构建最佳实践
随着谷歌对Eclipse的无情抛弃和对Android Studio的日趋完善,使用gradle构建Android项目已经成为开发者的一项必会良技.那么,问题来了,采用什么样的姿势才能让项目开发构建过程 ...
- 关于URL 解码, 编码
由于近期客户需要用到CA认证,此CA认证采用的是URL方式出传值 使用指定的编码对象将 URL 编码的字符串转换为已解码的字符串. 编码个人理解就是将某字符串以某种方式储存起来,而解码则以其编码格式得 ...
- 【转】Angularjs Controller 间通信机制
在Angularjs开发一些经验总结随笔中提到我们需要按照业务却分angular controller,避免过大无所不能的上帝controller,我们把controller分离开了,但是有时候我们需 ...
- SQL server 如何附加、还原、分离、备份数据库文件
No1 : 附加 No2 : 还原 一.(需要 .bak文件)首先建立一个数据库,数据库名称与你的.bak文件名要相同. 当然.这时候的这个数据库还是空的,需要还原回去数据.右键 ...
- log4Net配置详解
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...
- 数据库导出excel表数据
- 执行之前 (错误) 消息 错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS_E_OLEDBERROR.出现 OLE DB 错误.错误代码: 0x80040E37. (S ...
- maven+jetty项目在tomcat部署
步骤1:项目打包 clean install 步骤二:拷贝war 包到tomcat下 步骤三:修改server.xml文件的端口 步骤四:启动tomcat,注意jetty的项目是不需要带项目名的,To ...
- 狗狗40题~(Volume B)
H - Sorting Slides 应该是个二分匹配的模板题的,但我还不会写 = = 其实数据规模很小,就用贪心的方法就水过了(没加vis判冲突wa了几发,从此开始艰难的没有1A 的生活) #inc ...