题意 : 给出 N 头牛,以及 M 个某些牛之间的大小关系,问你最少还要确定多少对牛的关系才能将所有的牛按照一定顺序排序起来

分析 :

这些给出的关系想一下就知道是满足传递性的

例如 A > B && B > C 可以推出  A > C

也就是说如果用数组 arr[i][j] = true 表示牛 i 和 牛 j 有关系

那么 arr[i][k] = true && arr[k][j]  就可以推出 arr[i][j] = true

如果接触过 Floyd 算法就知道这很像算法里面的松弛操作

所以可以用 Floyd 求出所有传递闭包,最后看看还有矩阵中

除了 i ≠ j 的位置满足 arr[i][j] = false && arr[j][i] = false 答案就 + 1

注意这里必须是 arr[i][j] = arr[j][i] = false 单个 arr[i][j] = false 是不行的

因为如果 arr[i][j] = true 也就是我们确定了 i > j 这种关系

而一旦知道了这个关系,我们就可以确定 j < i 也就是 arr[j][i] = true

但是普通的 Floyd 算法的时间复杂度是 O( n3 ) 的,过不了这题的数据范围

这时候有一个套路,就是使用 std::bitset 优化

我们将关系矩阵存到一个 bitset 数组中 ( define == > bitset<maxn> arr[maxn] )

然后如果 arr[i][k] = true 那么也就是说 i 可以和 k 确定关系

那么 i 必定可以和关系矩阵中的第 k 行确定关系,所以直接进行或运算

即 if( arr[i][k] == true ) arr[i] |= arr[k]

这样就减少了一个 for 循环,可过此题

#include<bits/stdc++.h>
using namespace std;
;
bitset<maxn> arr[maxn];
int main(void)
{
    int N, M;
    while(~scanf("%d %d", &N, &M)){

        ; i<=N; i++)
            arr[i].reset(); ///将 bitset 的位全部变成 0

        int u, v; //u->v
        while(M--){
            scanf("%d %d", &u, &v);
            arr[u][v] = ; /// u 能和 v 确定关系
        }

        ; k<=N; k++)
            ; i<=N; i++)
                if(arr[i][k])
                    arr[i] |= arr[k];

        ;
        ; i<=N; i++) ///这里我们只要遍历一个上三角就可以了
            ; j<=N; j++)
                 &&
                   arr[j][i] == ) ans++;

        printf("%d\n", ans);
    }
    ;
}

POJ 3275 Ranking the cows ( Floyd求解传递闭包 && Bitset优化 )的更多相关文章

  1. poj 3275 "Ranking the Cows"(DFS or Floyd+bitset<>)

    传送门 题意: 农场主 FJ 有 n 头奶牛,现在给你 m 对关系(x,y)表示奶牛x的产奶速率高于奶牛y: FJ 想按照奶牛的产奶速率由高到低排列这些奶牛,但是这 m 对关系可能不能精确确定这 n ...

  2. POJ 3275 Ranking the Cows(传递闭包)【bitset优化Floyd】+【领接表优化Floyd】

    <题目链接> 题目大意:FJ想按照奶牛产奶的能力给她们排序.现在已知有N头奶牛$(1 ≤ N ≤ 1,000)$.FJ通过比较,已经知道了M$1 ≤ M ≤ 10,000$对相对关系.每一 ...

  3. Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset

    1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 323  Solved ...

  4. BZOJ2208 [Jsoi2010]连通数[缩点/Floyd传递闭包+bitset优化]

    显然并不能直接dfs,因为$m$会非常大,复杂度就是$O(mn)$: 这题有三种做法,都用到了bitset的优化.第二种算是一个意外的收获,之前没想到竟然还有这种神仙操作.. 方法一:缩点+DAG上b ...

  5. bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名【bitset+Floyd传递闭包】

    把关系变成有向边,稍微想一下就是要求在有向图中不能到达的点对个数,这个可以用Floyd传递闭包来做,但是n^3的复杂度跑不了1000 考虑bitset优化! 因为传递过程只会出现0和1,用bitset ...

  6. POJ3275 Ranking the Cows floyd的bitset优化

    POJ3275 Ranking the Cows #include <iostream> #include <cstdio> #include <bitset> u ...

  7. POJ 3660 Cow Contest(Floyd求传递闭包(可达矩阵))

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16341   Accepted: 9146 Desc ...

  8. HDU 5036 Explosion (传递闭包+bitset优化)

    <题目链接> 题目大意: 一个人要打开或者用炸弹砸开所有的门,每个门后面有一些钥匙,一个钥匙对应一个门,告诉每个门里面有哪些门的钥匙.如果要打开所有的门,问需要用的炸弹数量为多少. 解题分 ...

  9. POJ-3275:Ranking the Cows(Floyd、bitset)

    Ranking the Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3301   Accepted: 1511 ...

随机推荐

  1. MySQL 常用命令和基础语法

    -- mysql 命令 SHOW DATABASES; #查看目前系统中存在的数据库 use database_name; #切换数据库 SHOW TABLES; #显示当前数据库下面的所有可用的表 ...

  2. Java Web - 笔记(1)

    1.web.xml Attribute "xmlns:xsi" must be declared for element type "web-app"相关报错解 ...

  3. 小记---------手动执行脚本正常执行,使用crontab定时执行时 不执行

    可能出现的原因就是因为crontab不会从用户的/etc/profile文件中读取环境变量,所以就出现 使用定时crontab执行时 无法执行 抛错 所以在使用crontab 定时执行脚本时  在脚本 ...

  4. [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)

    [Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...

  5. 利用pcl数据结构,实现RegionGrowing的复现

    这篇博客是pcl中区域增长的算法进行简介以实现重写,并添加了一些判断条件. 起初原因是在使用pcl封装的regionGrowing时,效果不太好. 于是想自己重新写一下,通过改变其中种子点的生成策略和 ...

  6. HTTPS为什么是安全的?

    学习自https://www.cnblogs.com/zhangsanfeng/p/9125732.html,感谢博主 超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息,但以明文方式 ...

  7. django-restframework使用

    安装restframework: pip install djangorestframework 修改项目settings.py: INSTALLED_APPS = [ 'django.contrib ...

  8. JVM 之类加载器

    一.什么是 JVM JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程.当 Java 源文件能被成功编译成 .class 文件 ...

  9. iOS蓝牙中的进制转换,数据格式转换

    最近在忙一个蓝牙项目,在处理蓝牙数据的时候,经常遇到进制之间的转换,蓝牙处理的是16进制(NSData),而我们习惯的计数方式是10进制,为了节省空间,蓝牙也会把16进制(NSData)拆成2进制记录 ...

  10. 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

    一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...