题意 : 给出 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. windows VS2013中使用<pthread.h>

    1. 下载pthreads-w32-2-9-1-realease.zip 地址:http://www.mirrorservice.org/sites/sourceware.org/pub/pthrea ...

  2. 初步学习jquery学习笔记(四)

    Jquery HTML Jquery 捕获内容 什么是dom? DOM = Document Object Model(文档对象模型) 获取内容 text()获取所选元素的文本内容 html()获取所 ...

  3. 洛谷 P1169 棋盘制作 题解

    题面 这道题可以分成两部分来处理: 第一部分: 设f[i][j]表示右下角以(i,j)结尾的最大正方形的边长. 显然f[i][j]=min(f[i][j-1],f[i-1][j-1],f[i-1][j ...

  4. 树型DP入门

    题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚 ...

  5. Codeforces 1140F Extending Set of Points (线段树分治+并查集)

    这题有以下几个步骤 1.离线处理出每个点的作用范围 2.根据线段树得出作用范围 3.根据分治把每个范围内的点记录和处理 #include<bits/stdc++.h> using name ...

  6. springboot2.0处理自定义异常始终返回json

    1. 编写自定义异常类 package cn.jfjb.crud.exception; /** * @author john * @date 2019/11/24 - 9:48 */ public c ...

  7. 7.jQuery之显示与隐藏效果

    这里用到三个函数方法:show()   hide()  toggle() 注意点是三个方法里面的两个参数的使用,前一个参数是时间,表示显示速度:后一个参数是回调函数,只有前面的动画执行完之后,回调函数 ...

  8. Jquery复习(四)之text()、html()、val()

    三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回 ...

  9. JSTL 的<c:if>标签没有else的解决办法

    我们可以采用<c:choose>来代替<c:if> 具体结构: <c:choose> <c:when test=""> 如果 < ...

  10. 机器学习-回归中的相关度和R平方值

    1. 皮尔逊相关系数(Pearson Correlation Coefficient) 1.1 衡量两个值线性相关强度的量 1.2 取值范围[-1, 1] 正相关:>0, 负相关:<0, ...