每周一算法:传递闭包

题目描述

不等式排序

给定 n n n个变量和 m m m个不等式。其中 n n n小于等于 26 26 26,变量分别用前 n n n 的大写英文字母表示。

不等式之间具有传递性,即若 A > B A>B A>B B > C B>C B>C,则 A > C A>C A>C

请从前往后遍历每对关系,每次遍历时判断:

  • 如果能够确定全部关系且无矛盾,则结束循环,输出确定的次序;
  • 如果发生矛盾,则结束循环,输出有矛盾;
  • 如果循环结束时没有发生上述两种情况,则输出无定解。

输入格式

输入包含多组测试数据。

每组测试数据,第一行包含两个整数 n n n m m m

接下来 m m m 行,每行包含一个不等式,不等式全部为小于关系

当输入一行 0 0 0 0 0 0 时,表示输入终止。

输出格式

每组数据输出一个占一行的结果。

结果可能为下列三种之一:

  • 如果可以确定两两之间的关系,则输出 Sorted sequence determined after t relations: yyy...y.,其中t指迭代次数,yyy...y是指升序排列的所有变量。
  • 如果有矛盾,则输出: Inconsistency found after t relations.,其中t指迭代次数。
  • 如果没有矛盾,且不能确定两两之间的关系,则输出 Sorted sequence cannot be determined.

样例 #1

样例输入 #1

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

样例输出 #1

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

提示

【数据范围】

2 ≤ n ≤ 26 2≤n≤26 2n26,变量只可能为大写字母 A ∼ Z A\sim Z AZ

算法思想

根据题目描述,有 m m m个不等式,每个不等式均为小于关系,问最终能否确定 n n n个变量从小到大的次序。例如,每个关系是 A A A 的成绩排名高于 B B B 的排名,问最终能否确定班级排名?如下图所示:

在这里插入图片描述

在交际网络中,给定若干个元素和若干对二元关系,且关系具有传递性。通过传递性推导出尽量多的元素之间的关系,这类问题被称为传递闭包

使用「Floyd」算法可以解决传递闭包问题,其基本思想是:

  • 建立邻接矩阵 d d d,其中
    • d [ i , j ] = 1 d[i,j]=1 d[i,j]=1表示 i < j i<j i<j
    • 除了 i < j i<j i<j之外的情况, d [ i , j ] = 0 d[i,j]=0 d[i,j]=0
  • 每输入一对关系时,使用Floyd算法对 d d d进行传递闭包:
    • d[i][j] |= d[i][k] & d[k][j]
  • 传递闭包完成后,若存在变量 i , j i,j i,j使得
    • d [ i , j ] d[i,j] d[i,j] d [ j , i ] d[j,i] d[j,i]均为 1 1 1,则说明题目中给出的 m m m个不等式矛盾。
    • d [ i , j ] d[i,j] d[i,j] d [ j , i ] d[j,i] d[j,i]均为 0 0 0,则说明题目中给出的 m m m个不等式不能确定每一对变量之间的大小关系。
  • 对于每一对 i , j i,j i,j d [ i , j ] d[i,j] d[i,j] d [ j , i ] d[j,i] d[j,i]有且仅有一个为 1 1 1,则说明能确定每对变量之间的大小关系。

当变量之间的大小关系确定后,如何输出排好序的序列呢?

  • 建立一个状态数组 s t st st,其中
    • s t [ i ] = 0 st[i] = 0 st[i]=0表示当前变量还未输出
    • s t [ i ] = 1 st[i] = 1 st[i]=1表示当前变量已经输出
  • 从小到大遍历所有尚未输出的变量 i i i,即 s t [ i ] = 0 st[i]=0 st[i]=0,并且对于其它尚未输出的变量 j j j,使得 d [ j , i ] d[j,i] d[j,i]均为 0 0 0,那么 i i i就是尚未输出的最小的变量。

算法时间复杂度

「Floyd」算法解决传递闭包问题的时间复杂度为 O ( n 3 ) O(n^3) O(n3)

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n, m, d[N][N]; //传递闭包矩阵
bool st[N];
void floyd()
{for(int k = 0; k < n; k ++)for(int i = 0; i < n; i ++)for(int j = 0; j < n; j ++)d[i][j] |= d[i][k] & d[k][j];
}
int check() //检查当前关系
{for(int i = 0; i < n; i ++)if(d[i][i]) return 2; //当前关系存在矛盾for(int i = 0; i < n; i ++)for(int j = i + 1 ; j < n; j ++)if(d[i][j] == 0 && d[j][i] == 0) //双向都无法确定return 0;return 1;
}
char get_min()
{for(int i = 0; i < n; i ++) //从小到大遍历{if(st[i]) continue; //如果已经输出bool flag = true;for(int j = 0; j < n; j ++) //枚举其它尚未输出的变量{if(!st[j] && d[j][i] != 0){flag = false;break;}}if(flag) {st[i] = true;return 'A' + i;}}
}
int main()
{while(cin >> n >> m, n || m){memset(d, 0, sizeof d); //将矩阵初始化为0,表示关系不确定int type = 0, p; //type表示当前变量关系是否已经确定,p表示在输入第几个不等式时确定关系的for(int i = 1; i <= m; i ++){char s[5];cin >> s;int a = s[0] - 'A', b = s[2] - 'A';if(type == 0) //关系尚未确定{d[a][b] = 1;floyd(); //传递闭包type = check(); //检查当前所有不等式的关系if(type) p = i; //如果关系已确定,或者矛盾}}if(type == 0) puts("Sorted sequence cannot be determined."); else if(type == 2) printf("Inconsistency found after %d relations.\n", p);else{memset(st, 0, sizeof st);printf("Sorted sequence determined after %d relations: ", p);for(int i = 0; i < n; i ++) printf("%c", get_min()); //每次输出最小的printf(".\n");}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU prompt

提问&#xff1a; GPU是如何与CPU协调工作的&#xff1f; GPU也有缓存机制吗&#xff1f;有几层&#xff1f;速度差异是多少&#xff1f; GPU渲染流程有哪些阶段&#xff1f;他们的功能分别是什么&#xff1f; Early-Z技术是什么&#xff1f;发生在哪个阶段&#xff1f;这个…

Cocos 2048从创建到发布上线

二、审核通过之后上线流程 代码通过审核之后&#xff0c;会通过站内信和微信消息发送通知&#xff0c;在管理后台&#xff0c;点击提交发布&#xff0c;去备案

File类~路径、创建文件对象

路径分为相对路径&#xff08;不带盘符&#xff09;&#xff0c;绝对路径&#xff08;带盘符&#xff09; 路径是可以存在的&#xff0c;也可以是不存在的 创建文件对象的三个方法&#xff1a;

IDEA-SpringBoot项目启动类位置错误导致启动报错

文章目录 前言&#xff1a;本文为SpringBoot项目启动类位置错误导致启动报错解决方案 笔者在初学SpringBoot项目时遇到过因启动类位置错误导致项目启动报错现象&#xff0c;总结如下&#xff1a; SpringBoot启动发送请求后遇到如下错误&#xff1a; Postman界面信息&#xff1…

速了解及使用布隆过滤器

布隆过滤器 介绍 概念&#xff1a;是一种高效查询的数据结构 作用&#xff1a;判断某个元素是否在一个集合中。&#xff08;但是会出现误判的情况&#xff09; 实现原理 加入元素&#xff1a; 当一个元素需要加入到布隆过滤器中时&#xff0c;会使用一组哈希函数对该元素进…

JVM调优:JVM运行时数据区详解

一、前言 Java运行时数据区域划分&#xff0c;Java虚拟机在执行Java程序时&#xff0c;将其所管理的内存划分为不同的数据区域&#xff0c;每个区域都有特定的用途和创建销毁的时间。 其中&#xff0c;有些区域在虚拟机进程启动时就存在&#xff0c;而有些区域则是随着用户线程…

CANape测量分析标定

CANape创建工程及标定 1 创建工程 1. 创建ape工程 打开CANape软件,创建新的ape工程 2.添加数据库文件 通过添加Device(确定信号源)的方式加载数据库文件 A2L:通过添加CCP、 XCP、VX1000的Device DBC:对总线报文检测 CAN CDD: 诊断功能 Diagnostic 如需导入MAP文件…

道格拉斯普克算法(DP)的点云轮廓线简化

1、背景介绍 由于点云无法精确刻画目标对象边缘信息&#xff0c;因此常规提取的边缘点直接相连所生成的轮廓线&#xff0c;锯齿现象显著&#xff0c;与真实情况相差甚远&#xff08;图b所示&#xff09;。 道格拉斯-普克&#xff08;Douglas-Peuker&#xff09;抽稀算法是用来对…

【数据库系统工程师】2024年5月考前最后冲刺指南

一、备考关键&#xff1a; 高效率的备考方式&#xff1a;多轮迭代学习 △ 基础阶段 △ 大面积撒网(60%) 略读&#xff0d;> 做题 &#xff0d;> 回顾 &#xff0d;> 精读 △ 积累阶段 △ 有针对性的突破(30%) 完成所有章节之后&#xff0c;进行真题测试&#x…

爬取深圳2024年链家二手房数据,共3000条数据(其他城市也可)

文章目录 专栏导读1.目标2.导入相关库3.获取每个二手房的链接4.获取每个链接中的相关数据5.保存数据6.数据展示 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫…

鲜活很有感染力的女生图片_活力满满有生命力女生图片

鲜活很有感染力的女生图片_活力满满有生命力女生图片

公有云Linux模拟UDP端口并抓包

目录 写在前面操作步骤服务端开启UDP端口并监听客户端连接Wireshark抓包查看 写在前面 关于具体的操作&#xff0c;请参考我的上一篇文章 公有云Linux模拟TCP三次挥手与四次握手&#xff08;Wireshark抓包验证版&#xff09; 在本文&#xff0c;仅介绍与上一篇不同的地方。 操…

R语言:GSEA分析

#安装软件包 > if (!requireNamespace("BiocManager", quietly TRUE)) install.packages("BiocManager") > BiocManager::install("limma") > BiocManager::install("org.Hs.eg.db") > BiocManager::install("…

【算法刨析】完全背包

完全背包与01背包的区别 01背包对于一个物品只能选择一次&#xff0c;但是完全背包可以选择任意次&#xff1b; 思路 和01背包类似&#xff0c;01背包我们只需要判断选或不选&#xff0c;完全背包也是如此&#xff0c;不同的是&#xff0c;对于这个物品我们在判断选后在增加一…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 &#xff1a;程序员;相关院校师生 本书以轻松幽默的语言&#xff0c;从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序&#xff0c;寓意带读者从入门到精通。 书中每章都设有总结与扩展…

vue3延迟加载(异步组件​)defineAsyncComponent

最简单用法 Index.vue: <script setup> import { onMounted, defineAsyncComponent } from vue import ./index.cssconst Child defineAsyncComponent(() > import(./Child.vue))onMounted(() > {}) </script><template><div class"m-home-w…

Linux学习笔记4

书接上文&#xff0c;我们上两篇在讲建立最小Linux系统时要创建的几个脚本&#xff0c;接下来我们继续说一下 建立最小系统之创建文件系统所需文件&#xff08;续&#xff09; 之后我们返回etc目录&#xff0c;再返回system目录&#xff0c;接着使用“cd lib”命令进入到lib …

现在做电商迟吗?那是你不知道今年黑马,视频号小店重磅来袭

大家好&#xff0c;我是电商笨笨熊 24年想做电商&#xff0c;还能不能做&#xff1f; 当然可以。 电商是一个长期的市场&#xff0c;只要用户有需求&#xff0c;那么电商就会一直存在&#xff1b; 尤其是近几年来无货源模式爆火&#xff0c;对于我们商家来说这种无需自备货…

flutter 使用Scrollbar 时出现 滚动条不置顶问题

Flutter 使用 CupertinoScrollbar 、Scrollbar 与 ListView.builder 结合使用时&#xff0c; 当把 ListView.builder 边距设置为 padding: const EdgeInsets.all(0) 的时候&#xff0c; Scrollbar 的滚动条不置顶。 如图&#xff1a;右侧边上的滚动条 解决方法&#xff1a; …

抖店的爆品,到底是选出来的还是推出来的?我的看法是......

我是王路飞。 做电商的&#xff0c;你要说你对爆品没有想法&#xff0c;那劝你不要做了。 有人认为做抖店&#xff0c;爆品都是选出来的&#xff0c;毕竟方向不对&#xff0c;努力白费。 也有人认为做抖店&#xff0c;爆品都是推出来的&#xff0c;再好的产品&#xff0c;达…