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

    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. 原来这才是Kafka的“真面目”

    作者介绍 郑杰文,腾讯云存储,高级后台工程师,2014 年毕业加入腾讯,先后从事增值业务开发.腾讯云存储开发.对业务性.技术平台型后台架构设计都有深入的探索实践.对架构的海量并发.高可用.可扩展性都有 ...

  2. SSO 单点登录解决方案

    转自:http://www.blogjava.net/Jack2007/archive/2014/03/11/191795.html 1 什么是单点登陆      单点登录(Single Sign O ...

  3. 22.external version

    主要知识点 基于external version进行乐观锁并发控制 es提供了一个feature,就是说,你可以不用它提供的内部_version版本号来进行并发控制,可以基于你自己维护的一个版本号来进 ...

  4. Yii2验证码使用教程

    控制器代码 public function actions() { return [ 'captcha' => [ 'class' => 'yii\captcha\CaptchaActio ...

  5. Sperner定理及其证明

    额,最近看到了一个十分有趣的定理--Sperner定理.其实这个定理在OI中没什么用处,因此我都没把这篇文章放到我的OI标签里(不知道在MO中是否有用?)但是觉得它很有趣于是就过来写一下. 由于博主太 ...

  6. Bootstrap的js插件之警告框(alert.js)

    data-dismiss="alert"--为关闭button加入该属性能够使其自己主动为警告框赋予关闭功能. .fade .in--为警告框在关闭时加入动画效果. 很多其它细节參 ...

  7. java中String的21种使用方法

    (构造函数必须new出来) * public String (char[] vaue)                         将一个字符数组变成字符串(构造函数) * public Stri ...

  8. MySQL数据库——存储和函数

    一.存储过程1 基本语法CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body 格式[I ...

  9. Android端 配置极光推送

    由于业务须要,androidclient须要加推送.原来採用的百度推送.可是小米手机有时候收不到.后来换成了极光推送,极光的话全部设备都能收到推送,可是在高峰的时候会推迟.博主说的免费版的,收费的没用 ...

  10. chromium添加flash

    http://blog.csdn.net/lainegates/article/details/27830333