题目链接:

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---拓扑排序是否唯一的判断的更多相关文章

  1. ACM: poj 1094 Sorting It All Out - 拓扑排序

    poj 1094 Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & ...

  2. poj 1094 Sorting It All Out (拓扑排序)

    http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  3. [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 ...

  4. 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 ...

  5. poj 1094 Sorting It All Out_拓扑排序

    题意:是否唯一确定顺序,根据情况输出 #include <iostream> #include<cstdio> #include<cstring> #include ...

  6. POJ 1094 Sorting It All Out 拓扑排序 难度:0

    http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...

  7. PKU 1094 Sorting It All Out(拓扑排序)

    题目大意:就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列. 是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.判断该序列是否唯一: 3.该序列字母次序之间 ...

  8. [ACM] POJ 1094 Sorting It All Out (拓扑排序)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26801   Accepted: 92 ...

  9. POJ 1094 Sorting It All Out 【拓扑排序】

    <题目链接> 题目大意: 对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序. 解题分析 ...

随机推荐

  1. Hibernate 一对一关联映射,mappedBy参数解析

    在最近java,SSH框架的学习中遇到了这样的一个问题,在Hibernate的开发中一对一关联映射的单向关联,主表会在次表新增一列次表的主键如下图,但是在双向关联中次表不会在表中创建主表的主键一列,这 ...

  2. 关于embed的一些使用兼容

    因公司需求,要做一个扫描语音播报的功能,所以用到一些音频/视频标签 考虑到   <embed>   标签对于ie的兼容性更好一些所以,我在这采用了   <embed>   标签 ...

  3. 使用python和pygame绘制繁花曲线

    前段时间看了一期<最强大脑>,里面展示了各种繁花曲线组合成的非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意 ...

  4. Eclipse安卓开发环境搭建

    前提,Java SDK和Eclipse搭建完毕 下载android SDK并安装 (官网:http://sdk.android-studio.org/ ) 找到安装目录,运行“SDK Manager. ...

  5. react+redux+webpack+git技术栈

    一.git bash here mdkr cnpm init -y ls -a ls -l ls -la隐藏的也可查看 cat package.json 二.npm npm i webpack-dev ...

  6. DFA算法的简单说明!

    1.DFA算法简介 DFA全称为:Deterministic Finite Automaton,即确定有穷自动机.其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号 ...

  7. MySQL之索引详解

    这篇博客将要阐述为什么使用b+树作为索引,而不是b树或者其他树 1.什么是b树 (图片来自网络) b树相关特性:⑴关键字分布在整棵树中 ⑵任何一个关键字只出现在一个节点上 ⑶搜索可能在非叶子节点上结束 ...

  8. 【RabbitMQ系列】 Spring mvc整合RabbitMQ

    一.linux下安装rabbitmq 1.安装erlang环境 wget http://erlang.org/download/otp_src_18.2.1.tar.gz tar xvfz otp_s ...

  9. 系统右键添加cmd命令

    我们运行cmd.exe时,会发现刚刚打开时,一般提示在默认路径下: 有时候我们希望直接能够切换到某个路径下运行程序或者做某些工作,那么切换路径可能就会比较麻烦.下面我们介绍一种比较实用的方法,用鼠标右 ...

  10. Java作业-网络编程

    Java网络编程 关于结合以前的大作业(即我的图书馆管理系统) 我感觉,图书馆管理系统更像是一个偏向于B/S模式的体系,如果想让他可用性变得更好,可以优化的地方只有使用数据库来代替文件,我个人是没有想 ...