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个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序. 解题分析 ...
随机推荐
- 【阿里聚安全·安全周刊】500万台Android设备受感染|YouTube封杀枪支组装视频
本周的七个关键词: 500万Android 设备受感染丨 黑客将矛头指向无线传输协议 丨 YouTube封杀枪支视频 丨 AMD将发布补丁 丨 Gooligan Android 僵尸网络 丨 N ...
- linux性能调试之vmstat
linux性能监控调优工具vmstat: vmstat:用于监控.显示系统运行过程中的虚拟内存/CPU/磁盘状态. 简单示例(时间间隔2s,监控2次): 重要字段解释: r 表示运行队列(等待运行的进 ...
- Java生成图片验证码
在日常我们在登录或者注册的时候,网页上会出现验证码让我们填写,其实利用jdk提供给我们的工具类完全可以模拟出来一个生成验证码图片的功能. package util; import javax.imag ...
- Java中的懒汉式单例与饿汉式单例实例详解
懒汉式单例:线程非安全,当被调用的时候才创建实例,效率较高 public class LazySingleton { private static LazySingleton lazySingleto ...
- ping通但打不开网页
ping通但打不开网页 网页出现: The proxy server is refusing connections Firefox is configured to use a proxy serv ...
- docker 学习之一:docker 安装
核心概念1. 镜像是一个只读的模板类似于安装系统用到的那个iso文件我们通过镜像来完成各种应用的部署. 2. docker容器镜像类似于操作系统而容器类似于虚拟机本身.它可以被启动.开始.停止.删除等 ...
- Linux安装java环境教程
前言: 本教程基于jdk 1.8,但是此教程适用于jdk1.7等版本. 教程正文: 1.1. 登录Oracle官网下载jdk1.8安装包(gz结尾) 这里可以用"wget + 下载地址&qu ...
- 异步协程 的 trip库
import trip headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ...
- python3.* socket例子
On Server: # -*- coding: utf-8 -*-#this is the server import socketif "__main__" == __name ...
- nyoj 韩信点兵
描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种队形排尾的人数 ...