POJ 3275 Ranking the cows ( Floyd求解传递闭包 && Bitset优化 )
题意 : 给出 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优化 )的更多相关文章
- poj 3275 "Ranking the Cows"(DFS or Floyd+bitset<>)
传送门 题意: 农场主 FJ 有 n 头奶牛,现在给你 m 对关系(x,y)表示奶牛x的产奶速率高于奶牛y: FJ 想按照奶牛的产奶速率由高到低排列这些奶牛,但是这 m 对关系可能不能精确确定这 n ...
- POJ 3275 Ranking the Cows(传递闭包)【bitset优化Floyd】+【领接表优化Floyd】
<题目链接> 题目大意:FJ想按照奶牛产奶的能力给她们排序.现在已知有N头奶牛$(1 ≤ N ≤ 1,000)$.FJ通过比较,已经知道了M$1 ≤ M ≤ 10,000$对相对关系.每一 ...
- Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset
1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 323 Solved ...
- BZOJ2208 [Jsoi2010]连通数[缩点/Floyd传递闭包+bitset优化]
显然并不能直接dfs,因为$m$会非常大,复杂度就是$O(mn)$: 这题有三种做法,都用到了bitset的优化.第二种算是一个意外的收获,之前没想到竟然还有这种神仙操作.. 方法一:缩点+DAG上b ...
- bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名【bitset+Floyd传递闭包】
把关系变成有向边,稍微想一下就是要求在有向图中不能到达的点对个数,这个可以用Floyd传递闭包来做,但是n^3的复杂度跑不了1000 考虑bitset优化! 因为传递过程只会出现0和1,用bitset ...
- POJ3275 Ranking the Cows floyd的bitset优化
POJ3275 Ranking the Cows #include <iostream> #include <cstdio> #include <bitset> u ...
- POJ 3660 Cow Contest(Floyd求传递闭包(可达矩阵))
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16341 Accepted: 9146 Desc ...
- HDU 5036 Explosion (传递闭包+bitset优化)
<题目链接> 题目大意: 一个人要打开或者用炸弹砸开所有的门,每个门后面有一些钥匙,一个钥匙对应一个门,告诉每个门里面有哪些门的钥匙.如果要打开所有的门,问需要用的炸弹数量为多少. 解题分 ...
- POJ-3275:Ranking the Cows(Floyd、bitset)
Ranking the Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3301 Accepted: 1511 ...
随机推荐
- Quatrz + Spring
实例工程结构: 配置: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- 认识react, 并简单与vue对比
应用场景: 负责场景下的高性能 重用组件库,组件组合 中文官网:https://reactjs.org.cn/doc/in... 特点: 声明式编码(不需要关心如何实现,只需要关注在哪里做什么) 组件 ...
- vuex的简单理解
初次接触vuex,谈谈我自己的理解.有待后期改进 首先要知道,Vuex 是专门为 Vue.js 设计的状态管理库.我们知道在用vue.js进行前端项目开发时,会出现很多组件相互之间调用属性.状态,小项 ...
- python变量、对象和引用你真的明白了吗
python变量.对象和引用你真的明白了吗 变量.对象和引用 Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是 ...
- 银联支付SDK集成
下载地址 https://open.unionpay.com/upload/download/Development_kit85427986.rar其实我找了半个小时 也不知道怎么就下载好了 这个我在 ...
- Genymotion模拟器使用camera
1.前言 最近开发react-native的app,上传图片功能需要使用相机,发现Genymotion默认的相机不工作.查看同行的博客解决了,归纳整理一下. 2.步骤 2.1安装Genymotion: ...
- linux的安全--Selinux,tcp_wrappers,iptables使用
一.linux安全 安全主要是端口与服务的对应配置 1.1 linux安全主要通过下面三个进行加固 Selinux----主要是对内核的访问权限加以控制 tcp_wrappers---一定程度上限制某 ...
- 架构师必备,带你弄清混乱的JAVA日志体系!
作者:孤独烟 出处:http://rjzheng.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任 ...
- C#任务Task
完整调用 TaskCreationOptions tcOptions = TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRu ...
- 清北学堂提高组突破营游记day5
长者zhx来啦.. (又要送冰红茶了...) zhx一上来就讲动态规划...是不是要逼死人.... 动态规划: 最简单的例子:斐波那契数列.因为他是递推(通项公式不算)的,所以前面的已经确定的项不会影 ...