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全栈开发-Day7 字符编码总结
python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...
- NodeJs的async
async.auto最强大的一个api,它适合逻辑复杂的代码,代码中你一部分需要串行,两部分相互依赖,一部分又需要并行,代码中不需要依赖,这个时候你就可以通过auto随性所欲控制你的代码逻辑. var ...
- 【Python】 迭代器&生成器
迭代器 任何一个类,只要其实现了__iter__方法,就算是一个可迭代对象.可迭代对象的__iter__方法返回的对象是迭代器,迭代器类需要实现next方法.一般来说,实现了__iter__方法的类肯 ...
- GDB 调试多线程多进程
GDB是linux下的调试利器,在c/c++程序开发过程中必不可少的.这里总结一下多进程和多线程的调试方法和技巧. 多进程的调试: 如下示例 #include <sys/mman.h> # ...
- 数据管理 - 每天5分钟玩转 Docker 容器技术(147)
本章将讨论 Kubernetes 如何管理存储资源. 首先我们会学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Volume ...
- bashell基础
身为一个iOS程序员,虽然iOS相关技术十分重要,但是bash也是不可不了解的,因为技能的成长,除了深度,还需要广度.下面就来介绍下bash. Shell是C语言编写的,所以他是解释性语言,运行在Li ...
- 利用PCA降维
参考:<机器学习实战>- Machine Learning in Action 一. 基本思想 PCA(Principal Component Analysis),主成分分析.是目前应用 ...
- 学号:201621123032 《Java程序设计》第5周学习总结
1:本周学习总结 1.1: 写出你认为本周学习中比较重要的知识点关键词 接口interface,comparator接口和comparable接口. 1.2:尝试使用思维导图将这些关键词组织起来. 2 ...
- 200行Python代码实现2048
200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面 ...
- 在Nginx上配置多个站点
有时候你想在一台服务器上为不同的域名运行不同的站点.比如www.siteA.com作为博客,www.siteB.com作为论坛.你可以把两个域名的IP都解析到你的服务器上,但是没法在Nginx的根目录 ...