poj 1094 Sorting It All Out 拓补排序
Description
Input
Output
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. 题意:给一些大写字母的偏序关系。判断是否存在唯一的关系,或者他们的关系是矛盾的,即造成了回路,或者到最后不能确定他们的关系。
用拓扑排序:
1.拓扑排序可以用栈来实现,每次入栈的是入度为0的节点。
1.拓扑排序的结果一般分为三种情况:1、可以判断 2、有环出现了矛盾 3、条件不足,不能判断.
2.这道题不仅需要判断这三种情况,而且还要判断在处理第几个关系时出现前两种情况,对于本道题来说三种情况是有优先级的。前两种情况是平等的谁先出现先输出谁的相应结果,对于第三种情况是在前两种情况下都没有的前提下输出相应结果的.
#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
const int maxn=;
int n,m;
int pb[maxn][maxn],rd[maxn],list[maxn];
int toposort()
{
int i,j=;
int in[maxn];
memcpy(in,rd,sizeof(rd)); //复制入度数组,以防改变原数组
stack <int> s;
for(i=; i<n; i++) //入度为0的入栈
{
if(!in[i])
s.push(i);
}
bool flag=false;
while(!s.empty())
{
if(s.size()>)
flag=true;
int t=s.top(); // 记录出栈数字
s.pop();
list[j++]=t;
for(i=; i<n; i++)
{
if(pb[t][i])
{
in[i]--; //入度减一
if(!in[i])
s.push(i); //入度为0的继续入栈
}
}
}
if(j!=n) //存在回路
return ;
else if(flag) //有多重排序方式
return ;
return ;
}
int main()
{
while(cin>>n>>m,n||m)
{
memset(pb,,sizeof(pb));
memset(rd,,sizeof(rd));
char a,b;
int frist,scend;
frist=scend=;
for(int i=; i<=m; i++)
{
getchar();
scanf("%c<%c",&a,&b);
if(!frist && !scend)
{
if(pb[b-'A'][a-'A']==) //存在反向边
{
scend=;
printf("Inconsistency found after %d relations.\n",i);
continue;
}
if(!pb[a-'A'][b-'A'])
{
pb[a-'A'][b-'A']=;
rd[b-'A']++;
}
int res=toposort(); //进行拓扑排序
if(res==) //序列能够唯一被确定
{
printf("Sorted sequence determined after %d relations: ",i);
for(int j=; j<n; j++)
printf("%c",list[j]+'A');
printf(".\n");
frist=;
}
else if(res==) //存在回路
{
scend=;
printf("Inconsistency found after %d relations.\n",i);
}
} }
if(!frist&&!scend) //即不能唯一约定,又不构成回路
printf("Sorted sequence cannot be determined.\n");
}
return ;
}
poj 1094 Sorting It All Out 拓补排序的更多相关文章
- POJ 1094 Sorting It All Out【拓扑排序】
题目链接: http://poj.org/problem?id=1094 题意: 给定前n个字母的大小关系,问你是否 根据前xxx个关系得到上升序列 所有关系都无法确定唯一的一个序列 第xxx个关系导 ...
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
- POJ 1094 Sorting It All Out【拓扑排序 / 比较字母大小】
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38100 Accepted: 13453 ...
- [ACM] POJ 1094 Sorting It All Out (拓扑排序)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26801 Accepted: 92 ...
- POJ 1094 Sorting It All Out (拓扑排序,判断序列是否唯一,图是否有环)
题意:给出n个字符,m对关系,让你输出三种情况: 1.若到第k行时,能判断出唯一的拓扑序列,则输出: Sorted sequence determined after k re ...
- POJ 1094 Sorting It All Out 【拓扑排序】
<题目链接> 题目大意: 对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序. 解题分析 ...
- POJ - 1094 Sorting It All Out(拓扑排序)
https://vjudge.net/problem/POJ-1094 题意 对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用 ...
- 题解报告:poj 1094 Sorting It All Out(拓扑排序)
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
- ACM: poj 1094 Sorting It All Out - 拓扑排序
poj 1094 Sorting It All Out Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & ...
随机推荐
- ceil,floor,trunc,round,sign几个函数在SQL的使用方法
只是在oracle的环境下进行的几个数的测试,在这里只是举例说明,没有理论说明,抱歉. select ceil(1.8) from dual; --结果为1,向上取整select floor (1.8 ...
- Jmeter常用脚本开发之JDBC请求
简单说明:JDBC请求就是使用Jmeter连接数据库,执行sql语句,并返回对应的响应结果 步骤: 1.引入使用的数据库的驱动jar包,使用不同的数据库,我们需要引入不同的jar包.本文使用的MySQ ...
- windbg 边学边记attach 进程和open dump的两个方式查看线程的占用cpu资源
首先我是attach到进程的方式,附加到进程把. vs里边有个远程调试就是通过连接到远程机附加到进程操作的.在 有公网IP情况下挺好用,但涉及到nat穿越之类的,因为用户的不方便设置,这种调试方式也有 ...
- c#不同数组之间的转换【转载,消化自动删除】
c#中从string数组转换到int数组 string[] input = { "1", "2", "3", "4", ...
- Luogu 4556 雨天的尾巴 - 启发式合并线段树
Solution 用$col$记录 数量最多的种类, $sum$记录 种类$col$ 的数量. 然后问题就是树上链修改, 求 每个节点 数量最多的种类. 用树上差分 + 线段树合并更新即可. Code ...
- 201621123008 《Java程序设计》第八周学习总结
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码: public boolean contains(Object o ...
- WIN7成功安装Qt4.8方法,无需VS支持
下载地址:http://pan.baidu.com/share/link?shareid=159827&uk=4010603727 安装Qt方法 安装准备:1. qt-win-opensour ...
- vue ui之 iview 事件拦截
用过easyui的,应该清楚easyui组件有很多before事件拦截,有时候会特别重要. 最近在研究vue的ui组件iview虽然功能也不错,感觉还是没有像easyui那样强大,就比如before事 ...
- 编译https://github.com/CIR-KIT/steer_drive_ros时出现的问题
解决gazebo对应的protobuf版本问题: I've come across to the same problem. I'm using Ubuntu 16.04, ROS Kinetic a ...
- Java在dos界面运行java源文件编译成功,但运行虚拟机时出现错误:“找不到或无法加载主类”的问题
(一)首先检查环境变量配置有没有问题, 1PATH为%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 2CLASSSPATH为.;%JAVA_HOME%\lib\dt.jar; ...