做拓扑排序的题目,首先要知道两条定理:

    1、最后得到的拓扑数组的元素个数如果小于n,则不存在拓扑序列。  (有圈)

    2、如果一次入队的入度为零的点数大于1,则拓扑序列不唯一。  (关系不确定)

  本题有一个默认的东西,如果到了第K(看K<m)步,能唯一确定一个序列,就不用管之后会不会产生矛盾。

  这题的思路还是比较清晰的。输入也只有X<Y(只有<符号,并且X,Y都只是大写字母),数据量比较小。不过边数没有限制,用链式前向星的话不太好,还是用邻接矩阵吧。每次用邻接矩阵要注意的是判断重边,做小生成树的时候是用初始化边为无穷大,然后每次取小的。但是这里没有边权,所以只要有边,赋值为1,就可以了。遇到重边的话,不能再加入度。

  只需要拓扑排序就可以解决这个问题了。我就犯了画蛇添足的错误,我居然用floyd去判圈。这主要是对拓扑排序理解不够的原因。当出现的字母的数字小于n时,没出现的字母的入度是零,所以不影响拓扑排序产生的数据元素的个数。只有有圈的情况才会使得数组元素个数小于n。

  还有,我犯了一个很二的错误。因为没输入一组数据就要做一次拓扑排序。我居然把统计入度的数组没有变化就用了。囧了。再声明一个数组,每次拓扑排序之前,把入度数组的数据复制过来就好了。

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int N = ;
int ind[N],que[N], g[N][N],id[N];
int iq,flag, T;
void topo(int n)
{
int i,k,j=,x;
T=;
for(i=;i<=n;i++)
{
id[i]=ind[i];
if(id[i]==) que[j++]=i;
}
if(j>) T=;
x=j;
for(i=;i<j;i++)
{
if(j-x>) T=;
x=j;
int u=que[i];
for(k=;k<=n;k++)
{
if(g[u][k]&&u!=k)
{
id[k]--;
if(id[k]==) que[j++]=k;
}
}
}
iq=j;
}
void init()
{
flag=;
memset(ind,,sizeof(ind));
memset(g,,sizeof(g));
}
int main()
{
//freopen("test.txt","r",stdin);
int n,m,i,j,k,t,a,b;
char ch1,ch2,ch;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!n) break;
init();
t=;
for(k=;k<=m;k++)
{
do
scanf("%c",&ch1);
while (!isalpha(ch1)) ;
scanf("<%c",&ch2);
if(flag) continue;
a=ch1-,b=ch2-;
if(a>n||b>n||a==b) flag=;
if(flag) {printf("Inconsistency found after %d relations.\n",k);continue;}
if(g[a][b]) continue;
g[a][b]=;
ind[b]++;
topo(n);
if(iq<n){flag=;printf("Inconsistency found after %d relations.\n",k);continue;}
if(iq==n&&!T){
flag=;
printf("Sorted sequence determined after %d relations: ",k);
for(i=;i<n;i++) printf("%c",que[i]+);
printf(".\n");
continue;
}
if(k==m&&!flag) printf("Sorted sequence cannot be determined.\n");
}
}
return ;
}

poj1094Sorting It All Out 拓扑排序的更多相关文章

  1. poj1094Sorting It All Out——拓扑排序

    题目:http://poj.org/problem?id=1094 看到此题,首先觉得这是一种层层递进的关系,所以可以想到用拓扑排序: 就像人工排序,每次需要找到一个最小的,再找到新的最小的……所以用 ...

  2. POJ--1094--Sorting It All Out||NYOJ--349--Sorting It All Out(拓扑排序)

    NYOJ的数据水一点,POJ过了是真的过了 /* 拓扑排序模板题: 每次输入都要判断有环与有序的情况,如果存在环路或者已经有序可以输出则跳过下面的输入 判断有序,通过是否在一个以上的入度为0的点,存在 ...

  3. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  4. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

  5. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 609  Solved: 318[Submit][Status][Di ...

  6. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  7. 图——拓扑排序(uva10305)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  8. Java排序算法——拓扑排序

    package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...

  9. poj 3687(拓扑排序)

    http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...

随机推荐

  1. html第三节课

    表单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  2. js 中this到底指向哪里?

    其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...

  3. javascript 数组 常用方法

    前言  学学忘忘  闲来做个笔记 整理下数组常用方法. Array 数组常用方法  创建数组的基本方式有两种    1.第一种是使用Array构造函数,  var arr = new Array(); ...

  4. 爬取某网站景区列表并保存为csv文件

    网址:http://www.halehuo.com/jingqu.html 经过查看可以发现,该景区页面没有分页,不停的往下拉,页面会进行刷新显示后面的景区信息 通过使用浏览器调试器,发现该网站使用的 ...

  5. 编码GBK和GB2312、Unicode、UTF-8

    一.编码GBK和GB2312 随着计算机发展,各国已经不满足于单纯用ASCII码: 对于我们来说能在计算机中显示中文字符是至关重要的,所以我们还需要一张关于中文和数字对应的关系表: 一个字节8位二进制 ...

  6. android 权限问题分析

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...

  7. App后台开发运维和架构实践学习总结(1)——App后台核心技术之用户验证方案

    对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西. 一.使用Token进行身份鉴权 ...

  8. DJANGO里让用户自助修改密码

    参考了网上的实现,最终实现的各代码如下: changepwd.html模板文件: {% extends "Prism/index.html" %} {% load staticfi ...

  9. mysql-windows修改root密码

    安装mysql完成后 直接进入方式 mysql -u root -p 设置mysql的root密码 mysql -u root -p password 8888

  10. linux下select,poll,epoll的使用与重点分析

    好久没用I/O复用了,感觉差点儿相同都快忘完了.记得当初刚学I/O复用的时候花了好多时间.可是因为那会不太爱写博客,导致花非常多时间搞明确的东西,依旧非常easy忘记.俗话说眼过千遍不如手过一遍,的确 ...