求有限集传递闭包的 Floyd Warshall 算法(矩阵实现)

其实就三重循环。
zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id=1199

Problem B: 大小关系

Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 148  Solved: 31
[Submit][Status][Web Board]

Description

当我们知道一组大小关系之后,可判断所有关系是否都能成立,即关系间没有矛盾。
 
例如:A<B, A<C, B<C  通过这组关系我们可以得到A<B<C ,所有关系都成立,没有矛盾。
 
若 A<B, B<C, C<A  通过前两个关系我们得到 A<B<C ,这个关系与C<A矛盾,所有关系不能同时成立。
 
现在我们知道m个关系,请判断这m个关系是否能成立,成立输出“YES”,否则输出“NO”。

Input

多组数据,每组数据如下:

第一行有一个数字m。 m代表m组关系(1<=m<=400),接下来m行每行有一个关系,用两个不同的字母和一个符号表示。(输入保证字母在‘A’-‘Z’之间,关系符号只有 > , <)

Output

对于每组数据输出“YES”或“NO”.

Sample Input

3

A<B
A<C
B<C
3
A<B
B<C
C<A

Sample Output

YES

NO

/*********************************************************题解**************************************************************/

大于和小于 其实是一种关系,即两个元素之间的关系,b>a 可以用 a < b 来描述。

题目中所给的就是26
个字母之间的关系,我们可以用0 到25 的整数对应 A 到 Z ,用二维数组来表达元素之间的关系,如 re[0][25]==1 就表示 0 
< 25 ,即 A < Z。剩下的就只剩下推理的过程了。

学过  离散数学(上海科学技术文献出本社)的人都知道在  集合论 中 关系的性质中 有一种性质 叫做 传递性 而 < 这种关系就正好具有这种性质,当然小于 并不满足 自反性 和 对称性 这是我们推出矛盾的关键。

关系的的闭包运算 中 有一种闭包运算叫做 求关系 R 的 传递闭包 R+  ,这个 R+ 就是传递的,也就是说 如果在 R+ 中找到 a < b 和 b <  c 就一定能找到 a < c ,也就是说 R+ 就是推理过后所得到的关系。

求R+ 的算法:

for(i=0; i<26;++i){
          for( j=0;j<26;++j){
              if(re[ j ][ i ]){
                  for( k=0;k<26;++k){
                      re[ j ][ k ] +=re[ i ][ k] ;
                  }
              }
          }
        }

就这么多,感谢Warshall

顺便提一句,这个Floyd Warshall 和图论里面的那个经典的Floyd 算法的提出者是一个人,其实这道题也完全可以用图论的方式来做

/***************************************/

AC代码:

# include <iostream>
# include <string.h>
# include <stdlib.h>
# include <math.h>
# include <stdio.h>
# include <algorithm>
# include <stack>

int m,re[ 27 ][ 27 ];
char a,b,c,in[ 4 ];

int main(){
    using namespace std;
    int i,j,k;
    while(~scanf("%d",&m)){
       
        memset(re,0,sizeof(re));
       
        for( i=0; i<m; ++i){
            scanf("%s",in);
            a=in[ 0 ];
            c=in[ 1 ];
            b=in[ 2 ];
           
            if(c=='<'){
                re[ a-'A' ][ b-'A' ]=1;
            }else if(c=='>'){
                re[ b-'A' ][ a-'A' ]=1;
            }
        }
       
       
       
        for(i=0; i<26;++i){
          for( j=0;j<26;++j){
              if(re[ j ][ i ]){
                  for( k=0;k<26;++k){
                      re[ j ][ k ]+=re[ i ][ k ];
                  }
              }
          }
        }
       
        for(i=0;i<26;++i){
            for(j=0;j<26;++j)
            if(re[ i ][ j ]&&re[ j ][ i ]){
                cout << "NO\n";
                goto kkk;
            }
        }
       
        cout << "YES\n";
        kkk:;
    }   
   
    return 0;
}

1199 Problem B: 大小关系的更多相关文章

  1. [置顶] 如何判断两个IP大小关系及是否在同一个网段中

    功能点  判断某个IP地址是否合法 判断两个IP地址是否在同一个网段中 判断两个IP地址的大小关系 知识准备 IP协议 子网掩码 Java 正则表达式 基本原理 IP地址范围 0.0.0.0- 255 ...

  2. day03变量的命名规范,常量,输出:自带换行,输入,注释,数据类型,运算符,常用字符大小关系

    复习 ''' 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别的字符, ...

  3. storm中几个概念的大小关系

    从图可以看出来:topology>supervisor>worker>excutor>task; 也就是说一个topology可以运行在多个supervisor上,一个supe ...

  4. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

    /* 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 出现了回路!用这种方法必须 ...

  5. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  6. 关于CPU位数,OS位数以及内存大小关系的一点总结

    (这个学期做助教,说来好惭愧啊,虽然我也是考研进来的,但是就在两年前复习的资料居然全部都忘光了.对大二的孩子们提问的问题多半都解决不了!!!越来越觉得自己的学习方法有问题了,总是想着一些知识能够根据自 ...

  7. IAR map 文件报告与Flash 大小关系

  8. shell 大小关系 -eq -ne

    -eq:等于-ne:不等于-le:小于等于-ge:大于等于-lt:小于-gt:大于

  9. 父进程pid和子进程pid的大小关系

    如果进程ID最大值没有达到系统进程数的上限,子进程比父进程ID大.但是如果进程ID达到上限,系统会分配之前分配但是已经退出的进程ID给新进程,这样有可能出现子进程ID比父进程小.

随机推荐

  1. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  2. UITextView 输入字数限制

    本文介绍了UITextView对中英文还有iOS自带表情输入的字数限制,由于中文输入会有联想导致字数限制不准确所以苦恼好久,所以参考一些大神的博客终于搞定,欢迎大家参考和指正. 对于限制UITextV ...

  3. SASS教程sass超详细教程

    SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...

  4. 高大上的微服务可以很简单,使用node写微服务

    安装 npm install m-service --save 使用 编写服务处理函数 // dir1/file1.js // 使用传入的console参数输出可以自动在日志里带上request id ...

  5. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  6. 获取Canvas当前坐标系矩阵

    前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...

  7. CSS 特殊属性介绍之 pointer-events

    首先看一下 MDN 上关于 pointer-events 的介绍: CSS属性 pointer-events 允许作者控制特定的图形元素在何时成为鼠标事件的 target.当未指定该属性时,SVG 内 ...

  8. Unity3D框架插件uFrame实践记录(一)

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  9. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  10. setCapture、releasCapture 浅析

    1. setCapture 简介 setCapture可以将鼠标事件锁定在指定的元素上,当元素捕获了鼠标事件后,该事件只能作用在当前元素上. 以下情况会导致事件锁定失败: 当窗口失去焦点时,锁定的事件 ...