POJ1094 Sorting It All Out —— 拓扑排序
题目链接:http://poj.org/problem?id=1094
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 35468 | Accepted: 12458 |
Description
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
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
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.由于要输出当关系确定时是第几步,所以每一步都需要进行拓扑排序。(假如读完所有数据再进行拓扑排序,则无法确定关系确定时是第几步)。
2.在进行拓扑排序时(flag为状态类型,1表示冲突; 2表示不能确定; 3表示关系确定。 flag初始化为3):
(1) 如果入度为0的点的个数为0,则成环,可直接得出结果:冲突。直接return 1。
(2) 如果入度为0的点的个数为1,继续。
(3) 如果入度为0的点的个数大于1,则表明最小的那个不能确定。这时把flag改为2,然后继续。(为什么还要继续,不是可以直接return 2,表明关系还不能确定了吗? 虽然如此,但是继续拓扑排序下去,可能会发现环,即冲突。)
代码如下:
#include<stdio.h>//poj 1094
#include<string.h>
#include<stdlib.h> int deg[27], sub_deg[27],edge[27][27],n,m;
char a,b,c,ans[27]; int TopoSort()
{
int flag = 3;
memcpy(sub_deg,deg,sizeof(deg));
for(int i = 0; i<n; i++)
{
int k, cnt = 0;
for(int j = 0; j<n; j++)
if(sub_deg[j]==0) cnt++, k = j; if(cnt==0) return 1; //成环
if(cnt>1) flag = 2; //最小的不能确定。但不能直接退出,因为接下来可能会出现环。 sub_deg[k] = -1;
ans[i] = k+65;
for(int j = 0; j<n; j++)
if(edge[k][j]) sub_deg[j]--;
}
return flag;
} int main()
{
int flag,step;
while(scanf("%d%d",&n,&m) && (n||m))
{
int finished = 0, flag, step;
memset(deg,0,sizeof(deg));
memset(edge,0,sizeof(edge));
for(int i = 1; i<=m; i++)
{
getchar();
scanf("%c%c%c",&a,&c,&b);
if(finished) continue;
deg[b-65]++;
edge[a-65][b-65] = 1; ans[n] = 0;
flag = TopoSort();
if(flag==1 || flag==3) { step = i; finished = 1; }
} if(flag==1)
printf("Inconsistency found after %d relations.\n",step);
else if(flag==2)
printf("Sorted sequence cannot be determined.\n");
else
printf("Sorted sequence determined after %d relations: %s.\n",step,ans);
}
return 0;
}
POJ1094 Sorting It All Out —— 拓扑排序的更多相关文章
- [poj1094]Sorting It All Out_拓扑排序
Sorting It All Out poj-1094 题目大意:给出一些字符串之间的大小关系,问能否得到一个唯一的字符串序列,满足权值随下标递增. 注释:最多26个字母,均为大写. 想法:显然,很容 ...
- nyoj349 poj1094 Sorting It All Out(拓扑排序)
nyoj349 http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094 http://poj.org/problem?id=10 ...
- ACM: poj 1094 Sorting It All Out - 拓扑排序
poj 1094 Sorting It All Out Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & ...
- poj 1094 Sorting It All Out (拓扑排序)
http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断
题目链接: https://vjudge.net/problem/POJ-1094 题目大意: 该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上 ...
- POJ1094 Sorting It All Out LUOGU 排序
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40012 Accepted ...
- POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29984 Accepted: 10 ...
- [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 ...
- 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 ...
随机推荐
- Annual Congress of MUD
Annual Congress of MUD 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Multiuser dungeon games, also called MUD games ...
- 费用流(bzoj 3130)
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
- scanf printf函数返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); ...
- 一个强大的Android模拟器Genymotion
相信很多Android开发者一定受够了速度慢.体验差效率及其地下的官方模拟器了,自己在平时的开发中几乎是不会用模拟器的,等的时间太久了,但是在一些尺寸适配或是兼容性测试的时候没有足够多的机器进行测试, ...
- android控件-images
1.imageButton 图片按钮 <ImageButton android:id="@+id/imageButton" android:layout_width=&quo ...
- Java对象的死亡
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象). 一,引用计数算法 给 ...
- logistics regression
logistics regression用于解决一些二分类问题.比如(纯假设)网上购物时,网站会判断一个人退货的可能性有多大,如果该用户退货的可能性很大,那么网站就不会推荐改用户购买退费险.反之,如果 ...
- DICOM医学图像显示算法改进与实现——LUT
引言 随着Ul(超声成像).CT(计算机断层成像).MRI(核磁共振成像).CR(计算机X线成像).电子内窥镜.盯(正电子发射断层成像)和MI(分子影像)等医学影像设备不断涌现,利用计算机对医学影像设 ...
- WheelView实现省市区三级联动(数据库实现版本号附带完整SQL及数据)
近期在实现收货地址功能,用到了省市区三级联动效果,网上找到一般都是xml或json.数据源陈旧改动麻烦.改动了一下使用数据库方式实现了一下 数据源解决.因为数据量比較大通过初始化批量运行SQL的方式不 ...
- WCF 内存入口检查失败 Memory gates checking failed
在做JC系统时,出现这样的错误: 出现该错误信息的原因是因为WCF服务激活之前,系统应该具有的最小内存量不足config文件中设置的百分比.我是在本机调试的时候出现的. 解决方法: 关闭 ...