博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1094 拓扑排序
阅读量:4342 次
发布时间:2019-06-07

本文共 1477 字,大约阅读时间需要 4 分钟。

题意就不说了,很明显的拓扑排序。借这道题总结一下拓扑排序吧。拓扑排序的思路很明确但我总觉得有很多的细节值得注意,写的时候总是缺点这少点那的,不断的调试总是浪费很多的时间,以下是我总结的几点:

(1)拓扑排序的结果一般分为三种情况:1、可以判断 2、有环出现了矛盾 3、条件不足,不能判断,思路上一定要分清楚三种情况的条件判断。

(2)初始化栈的时候,将入度为零的顶点入栈,然后弹出栈顶元素e,e的邻接点的入度减一,若邻接点的入度也为零了,将该邻接点也入栈,如此循环,直到栈空。在这个过程中,栈中元素个数始终为一。若大于一则出现了多个顶点入度为零的情况,这时就无法辨别这几个顶点的先后顺序,这也就是条件不足的情况。若入度为零的顶点的个数为零,也就出现了环的情况,但这一情况必须是在弹出的元素的个数小于顶点总个数,所以在结束的时候需要将计数器与总个数相比较,因为会出现这样的情况:A<B,B<C,C<A,D<E,一开始时将D进栈,然后DE进,E出时没有元素可进了,若不在最后再进行一次比较的话,那么就认为可以判断了,然而其实是有环的。

   再说说这道题吧,这道题不仅需要判断这三种情况,而且还要判断在处理第几个关系时出现前两种情况,对于本道题来说三种情况是有优先级的。前两种情况是平等的谁先出现先输出谁的相应结果,对于第三种情况是在前两种情况下都没有的前提下输出相应结果的。

代码如下:

#include
#include
#include
#include
using namespace std;int indegree[27],edge[27][27],sequence[27],start[27],end[27],length;char vertex[27];int find(char c){ int i; for(i=0;i
Q; int aa[27]; flag1=flag2=false; for(i=0;i
1) flag2=true; else if(Q.size()==0) flag1=true; count++; e=Q.front(),Q.pop(); sequence[len++]=e; for(i=0;i
>n>>m,m&&n) { memset(indegree,0,sizeof(indegree)); memset(edge,0,sizeof(edge)); flag1=flag2=false; for(length=i=0;i
>s>>c>>t; ss=find(s); tt=find(t); if(ss!=tt && !edge[ss][tt]) indegree[tt]++; edge[ss][tt]=1; l=f(n); if(!flag1 && l==1) { flag1=true; k1=i+1; break; } else if(length>=n && !flag2 && l==0) { flag2=true; k2=i+1; break; } } if(flag1) { cout<<"Inconsistency found after "<
<<" relations."<
>s>>c>>t;} } return 0;}

转载于:https://www.cnblogs.com/yu-chao/archive/2011/08/08/2131329.html

你可能感兴趣的文章
PHP 超级全局变量
查看>>
1*1卷积核的理解和作用
查看>>
win32_c语言绘制曼德博集合(分形绘制)
查看>>
wc之上传图片
查看>>
程序员的核心技能是短期记忆力
查看>>
四.rocketMQ原理
查看>>
【原创】自己动手写的一个查看函数API地址的小工具
查看>>
sd卡的操作
查看>>
mui-当使用addeleventlisener()方法绑定事件时选择器无法绑定事件
查看>>
javascript 中的var : 隐含变量 全局变量 变量提升
查看>>
阿里巴巴Json工具-Fastjson讲解
查看>>
POJ 2376 (区间问题,贪心)
查看>>
SageCRM的学习资料
查看>>
Xtreme8.0 - Kabloom 动态规划
查看>>
Wing IDE 4.1使用笔记一修正一下框框字体显示不了中文
查看>>
【译】x86程序员手册26-7.5任务切换
查看>>
JS中null与undefined的区别
查看>>
有趣的程序
查看>>
牛客练习赛23 F 托米的游戏
查看>>
静态方法与非静态方法区别
查看>>