poj1094Sorting It All Out——拓扑排序
题目: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——拓扑排序的更多相关文章
- poj1094Sorting It All Out 拓扑排序
做拓扑排序的题目,首先要知道两条定理: 1.最后得到的拓扑数组的元素个数如果小于n,则不存在拓扑序列. (有圈) 2.如果一次入队的入度为零的点数大于1,则拓扑序列不唯一. (关系不确定) 本题有一 ...
- POJ--1094--Sorting It All Out||NYOJ--349--Sorting It All Out(拓扑排序)
NYOJ的数据水一点,POJ过了是真的过了 /* 拓扑排序模板题: 每次输入都要判断有环与有序的情况,如果存在环路或者已经有序可以输出则跳过下面的输入 判断有序,通过是否在一个以上的入度为0的点,存在 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- Java排序算法——拓扑排序
package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...
- poj 3687(拓扑排序)
http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...
随机推荐
- HTML5 2D平台游戏开发#2跳跃与二段跳
在上一篇<Canvas制作时间与行为可控的sprite动画>中已经实现了角色的左右移动,本篇继续实现角色的一系列动作之一:跳跃.先来看看最终效果: 要实现跳跃,必须模拟垂直方向的速度和重力 ...
- Redis闲谈(1):构建知识图谱
场景:Redis面试 (图片来源于网络) 面试官: 我看到你的简历上说你熟练使用Redis,那么你讲一下Redis是干嘛用的? 小明: (心中窃喜,Redis不就是缓存吗?)Redis主要用作缓存,通 ...
- MagicalRecord使用教程【转载】
原文地址:http://www.ithao123.cn/content-96403.html 下面是在xcode5.1下ARC环境中的使用教程 1. 将 MagicalRecord 文件夹拖入到工程文 ...
- linux 跟踪工具
strace工具,进程诊断.排错.跟踪系统调用和信号量 每行输出都是一个系统调用,包括函数和返回值. strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的 ...
- 机器学习实战之K-Means算法
一,引言 先说个K-means算法很高大上的用处,来开始新的算法学习.我们都知道每一届的美国总统大选,那叫一个竞争激烈.可以说,谁拿到了各个州尽可能多的选票,谁选举获胜的几率就会非常大.有人会说,这跟 ...
- 现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕这个点旋转。问最少需要移动几步。
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...
- html中文件类型的accept属性有哪些
*.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video *.ac3 audio/ac3 AC3 Audio *.asf allpication/vnd.ms-as ...
- Oracle JDBC 连接卡死后 Connection Reset解决过程
https://www.cnblogs.com/pthwang/p/8949445.html
- 计算机器内存数量+引入和显示ARDS成员
[1]README 1.1) 本代码在于读取内存中多个 内存段的地址范围描述符结构体(ARDS),有多少个内存段可以用: 1.2) source code and images in the blog ...
- C#判断WebService接口是否可用
using MSXML2; public bool InterfaceEnble() { string url = "http://localhost:81/WebServiceLogin. ...