每周一算法:传递闭包

news2024/11/21 2:35:16

题目描述

不等式排序

给定 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.coloradmin.cn/o/1656896.html

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

相关文章

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况&#xff0c;比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字&#xff0c;但是考虑到数据安全和费用问题&#xff0c;使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…

存储或读取时转换JSON数据

一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题&#xff1a; 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …

javaMail快速部署——发邮件喽~

目录 功能阐述 前序步骤 &#xff08;1&#xff09;到QQ邮箱中获取到授权码 代码实现 坑 今天在写一个修改密码的功能的时候要用到邮箱的发送&#xff0c;然后因为这个项目比较老旧了&#xff0c;采用的是javaWeb和jsp的配置&#xff0c;对于我只使用过springBoot整合的ja…

进一步分析并彻底解决 Flink container exit 143 问题

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

ASP.NET信息安全研究所设备管理系统的设计与实现

摘 要 以研究所的设备管理系统为背景&#xff0c;以研究所设备管理模式为研究对象&#xff0c;开发了设备管理系统。设备管理系统是设备管理与计算机技术相结合的产物&#xff0c;根据系统的功能需求分析与定义的数据模式&#xff0c;分析了应用程序的主要功能和系统实现的主…

最佳实践 | 八爪鱼采集器如何用PartnerShare做全民分销?

在数字化时代&#xff0c;数据采集和分析已经成为企业运营和决策的重要一环。八爪鱼采集器作为一款领先的SaaS产品&#xff0c;凭借其强大的数据采集和处理能力&#xff0c;成为了众多企业和个人用户的心头好。为了进一步拓展市场份额&#xff0c;提升品牌影响力&#xff0c;八…

nature《自然》期刊文献怎么在家查看下载

nature《自然》期刊我们都知道&#xff0c;是世界上历史悠久的、最有名望的科学杂志之一。下载该期刊文献是需要使用权限的&#xff0c;如果你没有nature《自然》期刊的资源&#xff0c;又该如何获取呢&#xff1f;请看本文的经验分享。 一、先百度“文献党下载器” 在文献党下…

PSCA电源管理软件栈示例

安全之安全(security)博客目录导读 目录 1、移动通讯系统 2、基础设施系统 本博客就PSCA电源管理软件栈进行举例&#xff0c;主要以移动通讯系统和基础设施系统为例来说明。 1、移动通讯系统 图3.4显示了一个可以在基于Linux的移动设备中实现的电源管理堆栈示例。 在Linux…

在uniapp中如何安装axios并解决跨域问题

目录 1、安装axios 2、导入 3、使用&#xff08;发请求&#xff09; 2.解决跨域问题 1.为什么要解决跨域问题&#xff1f; 2.前端如何解决跨域问题&#xff1f; 1、安装axios npm install axios 2、导入 在main.js中导入使用 import axios from axios; // 创建一个名…

【C++】STL-list模拟实现

目录 1、本次需要实现的3个类即接口总览 2、list的模拟实现 2.1 链表结点的设置以及初始化 2.2 链表的迭代器 2.3 容量接口及默认成员函数 1、本次需要实现的3个类即接口总览 #pragma once #include<iostream> #include<assert.h> using namespace std; templ…

机器学习算法之KNN分类算法【附python实现代码!可运行】

一、简介 在机器学习中&#xff0c;KNN&#xff08;k-Nearest Neighbors&#xff09;分类算法是一种简单且有效的监督学习算法&#xff0c;主要用于分类问题。KNN算法的基本思想是&#xff1a;在特征空间中&#xff0c;如果一个样本在特征空间中的k个最相邻的样本中的大多数属…

每日Attention学习5——Multi-Scale Channel Attention Module

模块出处 [link] [code] [WACV 21] Attentional Feature Fusion 模块名称 Multi-Scale Channel Attention Module (MS-CAM) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nnclass MS_CAM(nn.Module):def __init__(self, channels64, r4):super(…

Android NDK开发——Android Studio 3.5.2安装与配置踩坑

Android NDK开发——Android Studio 3.5.2安装与配置踩坑 一、Android Studio下载二、配置踩坑报错1&#xff1a;Failed to install the following Android SDK packages as some licences have not been accepted报错2&#xff1a;No toolchains found in the NDK toolchains …

【全开源】Java上门洗车小程序源码上门洗车APP 小程序源码支持二次开发6.0

功能特点&#xff1a; 跨界创新&#xff1a;融入科技元素&#xff0c;借助移动互联网快速发展&#xff0c;将科技引入到传统洗车业中。 科技赋能&#xff1a;具有智能化的特点&#xff0c;用户可以根据自身的需求选择不同的洗车项目和服务&#xff0c;包括洗车的时间、地点和服…

滥用 Kubernetes 资源登上月球

Sysdig 2024 年云原生安全和使用报告强调了不断变化的威胁形势&#xff0c;但更重要的是&#xff0c;随着容器和 Kubernetes 等云原生技术的采用不断增加&#xff0c;并非所有组织都遵循最佳实践。当攻击者在 Kubernetes 等操作中利用容器来利用资源时&#xff0c;这最终会给攻…

【stomp 实战】spring websocket 接收消息源码分析

后台消息的发送过程&#xff0c;我们通过spring websocket用户消息发送源码分析已经了解了。我们再来分析一下后端接收消息的过程。这个过程和后端发送消息过程有点类似。 前端发送消息 前端发送消息给服务端的示例如下&#xff1a; 发送给目的/app/echo一个消息。 //主动发…

线程安全的概念及原因

1.观察线程不安全 public class ThreadDemo {static class Counter {public int count 0;void increase() {count;}}public static void main(String[] args) throws InterruptedException {final Counter counter new Counter();Thread t1 new Thread(() -> {for (int …

ES:聚合查询语法

基础查询结构&#xff1a; GET http://ip:prot/textbook/_search { "query" : { ...query子句... }, "aggs" : { "agg_name":{ "agg_type": { "agg_arg": agg_arg_value } } }, "sort" : { ..sor…

Cesium--加载天地图

背景&#xff1a;vue-admin-temlate cesium 天地图 天地图地址&#xff1a;国家地理信息公共服务平台 天地图 步骤一&#xff1a;申请成为天地图开发者&#xff0c;创建应用 1,天地图使用方法&#xff08;点击开发资源即可看到此页面&#xff09; 2,点击控制台-登录账号 …

13:HAL---SPI

目录 一:SPL通信 1:简历 2:硬件电路 3:移动数据图 4:SPI时序基本单元 A : 开/ 终条件 B:SPI时序基本单元 A:模式0 B:模式1 C:模式2 D:模式3 C:SPl时序 A:发送指令 B: 指定地址写 C:指定地址读 5&#xff1a;NSS(CS) 6&#xff1a;时钟 二: W25Q64 1:简历 2…