题目:http://poj.org/problem?id=1094

看到此题,首先觉得这是一种层层递进的关系,所以可以想到用拓扑排序;

就像人工排序,每次需要找到一个最小的,再找到新的最小的……所以用有向边代表小的元素到大的元素的关系,每次的入度为0的点就是最小的;

出现错误也就是出现了环,可以看做是拓扑排序过程后还有没有被排到的点,也就是怎样入度都不为0;

因为要输出哪一步,所以就一步一步,每一步上建图、判断等等;

注意因为上一步不能影响下一步,所以排序中不能把真的入度减去。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int n,m,reg[],ans[],num,tmp[];
bool sid[][],f0,f1;
char dc[];
int per()
{
memset(ans,,sizeof ans);
while(q.size())q.pop();
for(int i=;i<=n;i++)
if(!reg[i])q.push(i);//
memcpy(tmp,reg,sizeof reg);//!!!注意别影响全局
num=;
bool flag=;
while(q.size())
{
if(q.size()>)flag=;//有超过一个入度为0的点
int x=q.top();q.pop();
ans[++num]=x;
for(int i=;i<=n;i++)
if(sid[x][i])
{
tmp[i]--;
if(!tmp[i])q.push(i);
}
}
if(num<n)return ;//即使不完全也应该有n个,否则有环
if(flag)return -;//可能还没完全
return ;
}
int main()
{
while(scanf("%d%d",&n,&m)==)
{
if(!n&&!m)return ;
memset(sid,,sizeof sid);
memset(reg,,sizeof reg);
f0=;f1=;
for(int i=;i<=m;i++)
{
cin>>dc;
if(f0||f1)continue;
if(sid[dc[]-'A'+][dc[]-'A'+])
{
f0=;
printf("Inconsistency found after %d relations.\n",i);
continue;
}
if(!sid[dc[]-'A'+][dc[]-'A'+])//!!!
{
sid[dc[]-'A'+][dc[]-'A'+]=;
reg[dc[]-'A'+]++;
}
int k=per();
if(!k)
{
f0=;
printf("Inconsistency found after %d relations.\n",i);
}
if(k==)
{
f1=;
printf("Sorted sequence determined after %d relations: ",i);
for(int i=;i<=n;i++)
printf("%c",char(ans[i]+'A'-)); printf(".\n");
}
}
if(!f0&&!f1)
printf("Sorted sequence cannot be determined.\n");
}
}

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

  1. poj1094Sorting It All Out 拓扑排序

    做拓扑排序的题目,首先要知道两条定理: 1.最后得到的拓扑数组的元素个数如果小于n,则不存在拓扑序列.  (有圈) 2.如果一次入队的入度为零的点数大于1,则拓扑序列不唯一. (关系不确定) 本题有一 ...

  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. JavaScript -- JavaScript DOM 编程艺术(第2版)

    /* 渐进增强 平稳退化 网页 结构层(structural layer): HTML 表示层(presentation layer): CSS <link rel="styleshe ...

  2. C#高级编程 第十五章 反射

    (二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(At ...

  3. Android Thread.UncaughtExceptionHandler异常消息捕获

    public void uncaughtException(Thread thread, Throwable ex) { //处理异常 Log.e("崩溃",thread.getN ...

  4. 九度OJ 1059:abc (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3642 解决:2869 题目描述: 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的 ...

  5. 九度OJ 1029:魔咒词典 (排序)

    时间限制:5 秒 内存限制:32 兆 特殊判题:否 提交:4574 解决:1318 题目描述:     哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部 ...

  6. function declarations are hoisted and class declarations are not 变量提升

    Classes - JavaScript | MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes ...

  7. cocos2d-js添加百度MSSP插屏(通过jsb反射机制)

    1.导入jar包.... 2.修改AndroidManifest.xml文件 添加: <meta-data android:name="BaiduMobAd_APP_ID" ...

  8. 常见寄存器以及常见汇编指令,常见爆破指令 good

    CPU的任务就是执行存放在存储器里的指令序列.为此,除要完成算术逻辑操作外,还需要担负CPU和存储器以及I/O之间的数据传送任务.早期的CPU芯片只包括运算器和控制器两大部分.到了近几年,为了使存储器 ...

  9. django 设置静态文件,static 链接

    这篇文章讲的django 静态static 文件设置,还可以,供参考 http://blog.csdn.net/sinat_21302587/article/details/74059078

  10. P5105 不强制在线的动态快速排序

    P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...