题意 : 给出 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. composer配合github发布管理代码包

    前言 今日使用composer结合github管理代码包过程,方便日后需要,特此记录 流程 1 最大同性交友网站github创建自己项目,在自己项目新增composer.json文件 2 compos ...

  2. elementUI -->实现简单的购物车

    <template> <div class="bbb"> <el-checkbox :indeterminate="isIndetermin ...

  3. 微信小程序--catchtap&bindtap

    转自:https://www.cnblogs.com/heron-yu/p/7244481.html 转自:http://blog.csdn.net/xiaochun365/article/detai ...

  4. leveldb Arena

    背景我们都知道,对于一个高性能的服务器端程序来说,内存的使用非常重要.C++提供了new/delete来管理内存的申请和释放,但是对于小对象来说,直接使用new/delete代价比较大,要付出额外的空 ...

  5. MySQL-4- 索引及执行计划

    1. 索引作用 提供了类似于书中目录的作用,目的是为了优化查询 2. 索引的种类(算法) B树索引 Hash索引 R树 Full text GIS 3. B树 基于不同的查找算法分类介绍   B-tr ...

  6. Python 之父 63 岁才退休,我 23 就中年危机。。

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 Python 之父 Guido van Rossum 在推特公布了自己从 Dropbox 公司离职的消息,并表示已经退休. ...

  7. numpy数组转置与轴变换

    numpy数组转置与轴变换 矩阵的转置 >>> import numpy as np >>> arr=np.arange(15).reshape((3,5)) &g ...

  8. Python 集合的各种操作 数学运算 关系操作 增删改查 生成式

    # 集合是无序的 是可变的 不能重复 允许数学运算 分散存储 # 创建# collegel = {'哲学','经济学','法学','教育学'}## # {'教育学', '经济学', '法学', '哲学 ...

  9. PythonDay12

    day12内置_函数 今日内容 生成器 推导式 内置函数一 生成器 什么是生成器?生成器的本质就是一个迭代器 迭代器是python自带的 生成器是程序员自己写的一种迭代器 生成器编写方式: 1.基于函 ...

  10. ckfinder的使用

    引入<script type="text/javascript" src="${ctxStatic}/ckfinder/ckfinder.js">& ...