POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断
题目链接:
https://vjudge.net/problem/POJ-1094
题目大意:
该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列。是典型的拓扑排序,但输出格式上确有三种形式:
1.该字母序列有序,并依次输出;
2.该序列不能判断是否有序(序列不唯一);
3.该序列字母次序之间有矛盾,即有环存在。
思路:
这里应该用Kahn算法拓扑排序
每加入一条边需要进行一次拓扑排序,如果拓扑排序发现有环,或者排序唯一那么就可以直接输出结果,如果所有的边输入完成还不是上述两种情况,那就输出不能判断。
这里的重点在于如何判断拓扑排序的唯一性,这里运用了Kahn算法的思想。
Kahn算法:
1.找到入度为0的顶点加入栈中,然后提出栈顶元素,成为拓扑排序的一部分
2.除去与之相邻所有边并减少其度数,再次加入入度数为0的点循环往复,如果某一次栈已经空了而且没有入读为0的点,那就是存在有向环。
判断唯一性:
那就得每次找到入度为0的顶点个数只能是1个,是0个说明存在环,多个说明拓扑排序不唯一。
由于每次只能有一个0度顶点,所以可以循环n次,依次找出拓扑排序中的每一位
需要注意的是,如果有一次找出了多个0度顶点,不能直接返回无序,只能暂时标记,因为可能之后的循环中存在环。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<sstream>
#include<functional>
using namespace std;
typedef long long ll;
const int maxn = + ;
const int INF = 1e9 + ;
int T, n, m, cases;
vector<int>Map[maxn];
int Count[maxn];
int ans[maxn];
int topo()
{
int cnt[maxn];
memcpy(cnt, Count, sizeof(Count));
int flag = ;
for(int i = ; i < n; i++)//为判断顺序是否唯一,有序的顺序拓扑排序需要n次循环
{
int tot = ;//度数为0的顶点的个数,超过一个说明拓扑排序一定不是唯一,可能不能确定,可能有环
int u;//记录度数为0的点
for(int j = ; j < n; j++)if(cnt[j] == ){tot++, u = j;}
if(tot == )return ;//有环
if(tot > )flag = -;//一定不唯一,但是不能立马退出,因为之后有可能是有环
ans[i] = u;//记录拓扑排序顺序
cnt[u] = -;//已经排好,设成负数
for(int j = ; j < Map[u].size(); j++)
{
int v = Map[u][j];
cnt[v]--;
}
}
return flag;
}
int main()
{
while(cin >> n >> m)
{
if(!n && !m)break;
string s;
int flag = ;
for(int i = ; i <= n; i++)Map[i].clear();
memset(Count, , sizeof(Count));
for(int i = ; i <= m; i++)
{
cin >> s;
int u = s[] - 'A';
int v = s[] - 'A';
Map[u].push_back(v);
Count[v]++;//入度
if(flag)continue;//如果已经判断出有序或者有环,就不做处理
int t = topo();
//cout<<t<<endl;
if(t == )//有环
{
printf("Inconsistency found after %d relations.\n",i);
flag = ;
}
if(t == )//有序
{
printf("Sorted sequence determined after %d relations: ",i);
for(int i = ; i < n; i++)printf("%c", ans[i] + 'A');
printf(".\n");
flag = ;
}
}
if(!flag)printf("Sorted sequence cannot be determined.\n");
}
return ;
}
POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断的更多相关文章
- ACM: poj 1094 Sorting It All Out - 拓扑排序
poj 1094 Sorting It All Out Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & ...
- poj 1094 Sorting It All Out (拓扑排序)
http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
- POJ 1094 Sorting It All Out (拓扑排序) - from lanshui_Yang
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
- poj 1094 Sorting It All Out_拓扑排序
题意:是否唯一确定顺序,根据情况输出 #include <iostream> #include<cstdio> #include<cstring> #include ...
- POJ 1094 Sorting It All Out 拓扑排序 难度:0
http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...
- PKU 1094 Sorting It All Out(拓扑排序)
题目大意:就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列. 是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.判断该序列是否唯一: 3.该序列字母次序之间 ...
- [ACM] POJ 1094 Sorting It All Out (拓扑排序)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26801 Accepted: 92 ...
- POJ 1094 Sorting It All Out 【拓扑排序】
<题目链接> 题目大意: 对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序. 解题分析 ...
随机推荐
- 【Python】 SQLAlchemy的初步使用
SQLAlchemy 在很多Python的web框架中都整合进了SQLAlchemy这个主要发挥ORM作用的模块.所谓ORM,就是把复杂的SQL语句给包装成更加面向对象,易于理解的样子.在操作数据库的 ...
- C++关联容器知识总结
C++的容器类型可以分为顺序容器和关联容器两大类.顺序容器的知识可以参看我上篇的随笔<C++顺序容器知识总结>.关联容器支持通过键值来高效的查找和读取元素,这是它和顺序容器最大的区别.两种 ...
- phpcms v9 列表页直接下载功能代码实现
{pc:content action="lists" catid="$catid" num="3" order="id DESC& ...
- java基础笔记(3)----函数
前言引入函数前,所有的代码都写在main主函数中,代码过多,代码冗余,可读性差. 引入函数后,函数是实现某一特定功能的代码块.一个类中可以定义多个函数,每个函数和main主函数都是并列关系. 函数: ...
- 微信app支付详细教程
微信支付作为三大支付之一,越来越多的客户要求产品中添加微信支付 但是网上能找到可用的demo很少 所以写一篇自己写微信支付的过程,希望能给有需要的开发者一点帮助. 下面让我们来进入正题 1准备工作 ...
- php设计模式八-----装饰器模式
1.介绍: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 根据IO流源码深入理解装饰设计模式使用
一:摘要 通过对java的IO类中我们可以得出:IO源码中使用装饰设计模式频率非常高, 对装饰设计模式而言,他能够避免继承体系的臃肿,同时也可以动态的给一个对象添加一些额外的功能,如果要扩展一个功能, ...
- JavaWeb学习笔记七 事务
什么是事务?一件事情有n个组成单元 ,要么这n个组成单元同时成功,要么n个单元就同时失败.就是将n个组成单元放到一个事务中. mysql的事务 默认的事务:一条sql语句就是一个事务,默认就开启事务并 ...
- 配置 CSV Data Set Config 来参数化新增客户信息操作
1.首先根据新增客户信息的http请求,来确定需要参数化的变量,选取符合测试需求且经常变化或未来会变化的变量为需要参数化的变量,如本文中的客户端名称(sys_name).描述(description) ...
- C语言的第一次作业总结
PTA实验作业 题目一:温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码: ...