【POJ No. 3275】奶牛排序 Ranking the Cows
【POJ No. 3275】奶牛排序 Ranking the Cows
官方题目地址
【题意】
约翰想按照奶牛的产奶能力给它们排序。
已知有N (1≤N ≤1 000)头奶牛,而且知道这些奶牛的M (1≤M≤10 000)种关系,将每种关系都表示为“X Y ”,表示奶牛X 的产奶能力大于奶牛Y 。约翰想知道自己至少还要调查多少对关系才能完成整个排序。
【输入输出】
输入:
第1行包含两个整数N 和M 。第2…M +1行,每行都包含两个整数X 和Y 。X 和Y 都在1~N 范围内,表示奶牛X 的排名高于奶牛Y。
输出:
单行输出至少还要调查多少种关系才能完成整个排序。
【样例】
【思路分析】
在输入样例中,cow2 >cow1 >cow5 ,cow2 >cow3 >cow4 ,所以cow2 的排名最高。不过,约翰需要知道排名大于cow1 及cow3 的排名第二的牛,还需要通过一个问题来确定cow4 和cow5 的顺序。之后,他需要知道如果cow1 大于cow3 ,那么cow5 是否大于cow3 。他必须问三个问题才能确定排名:“cow1 >cow3 ?cow4 >cow5 ?”“cow5 >cow3?”。
【算法设计】
① 根据输入样例,创建一个有向图。
② 根据传递性,得到的已知关系有7种,分别是:1>4、1>5、2>1、2>3、2>4、2>5、3>4。
③ 对于有n 个节点的图,两两之间的关系一共有n (n -1)/2种,5个节点共有5×4/2=10种关系,还需要知道10-7=3种关系即可。
[如何得到已知关系]
利用bitset位运算,将每个节点都用一个bitset 表示。
bitset<maxn>p[maxn]; //maxn表示位数,p[] 表示二进制数组
初始化时,p [ i ][ i ]=1,即p [i ]的第i 位为1(从右侧数第0位、1位、2位)。
输入1-5,令p [1][5]=1,则p [1]=…….100010。
输入1-4,令p [1][4]=1,则p [1]=…….110010。
输入2-1,令p [2][1]=1,则p [2]=…….000110。
输入2-3,令p [2][3]=1,则p [2]=…….001110。
输入3-4,令p [3][4]=1,则p [3]=…….011000。
判断每个数组的每一位:
if(p[i][k]){p[i] |= p[k]; //按位或运算
}
例如,p [2][1]=1,则p [2]=p [2]|p [1]= 001110 | 110010=111110。如果2和1有关系,而1和4、5有关系,则通过或运算,可以得出2和4、5也有关系。
通过此方法,可以找到每个点和其他点的关系。用ans累计每个数组元素1的个数,因为初始化时自己到自己为1,所以ans多算了n 种关系,已知关系数应为ans-n ,用n (n -1)/2减去已知关系数即可。
for(int i = 1; i <= n ; i ++){ans += p[i].count(); //每个数组中元素1 的个数
}
cout << n * (n - 1) / 2 - ans + n << endl;
【算法实现】
#include<iostream>
#include<bitset>using namespace std;const int maxn = 1005;
bitset<maxn>p[maxn];int main(){int n , m;cin >> n >> m;for(int i = 1 ; i <= n ; i ++){p[i][i] = 1;}while(m --){int u , v;cin >> u >> v;p[u][v] = 1;}for(int k = 1; k <= n ; k++){for(int i = 1 ; i <= n ; i ++){if(p[i][k]){p[i] |= p[k]; }} }int ans = 0;for(int i = 1; i <= n ; i++){ans += p[i].count();}cout << n * (n - 1) / 2 - ans + n << endl;return 0;
}
【POJ No. 3275】奶牛排序 Ranking the Cows相关推荐
- POJ 3275 Ranking the Cows (floyd传递闭包)
Ranking the Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2248 Accepted: 1045 ...
- POJ3275 Ranking the Cows【关系闭包】
Ranking the Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3510 Accepted: 1608 Desc ...
- powerquery分组_Power Query系列 - 排序Ranking
Power Query系列 - 排序Ranking 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 概况: 在数据分析中,我们常常需要对数据进行排序,同时我们想知道某个项目或者产品的排名, ...
- P2881 [USACO07MAR]Ranking the Cows G
P2881 [USACO07MAR]Ranking the Cows G 题目描述 输出格式 Line 1: A single integer that is the minimum value of ...
- poj 3275 Ranking the Cows 搜索
题意:给你n个数和m个大小关系,问给出了这些大小关系之后还有多少对数的大小关系不知道. 分析:根据给出的大小关系建有向边,每次对每个点延有向边搜索到底,确定该边的所有连边关系,最后统计没有关系的边对数 ...
- 奶牛排序 cow sort 置换群
链接:https://ac.nowcoder.com/acm/contest/924/H 来源:牛客网 题目描述 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便 ...
- Ranking the Cows(POJ-3275 )
Problem Description Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positi ...
- POJ 2871 整数奇偶排序
时间限制: 1000ms 内存限制: 65536kB 描述 输入10个整数,彼此以空格分隔 重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到小排列: 2.然后输出其中的偶数 ...
- POJ 1094拓补排序
POJ 1094拓补排序问题,需要加一些判断 #include <cstdio> #include <queue> #include <vector> #inclu ...
最新文章
- python cx oracle安装_python3.6的安装及cx_oracle安装
- 从iOS证书申请到签名文件生成
- ETOPS:双发飞机延伸航程运行
- 鸿蒙系统开发者公测,公测尝鲜开启!华为Mate40/P40开始和安卓渐行渐远
- python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码
- Android开发之assets目录下资源使用总结
- ISA server的常见身份验证方式
- hdu java_HDU-java实现1176
- 如何使用Xcode分析调试在真机运行的UE4 IOS版游戏
- Xpath路径表达式
- android内核读取file文件
- spring yml 配置事务_application.yml与bootstrap.yml的区别
- Win10 新机,这些必装软件你拥有了吗?
- extjs表格编辑、EditorGridPanel
- matlab kappa风险分析,我为什么反对在属性数据MSA中用Kappa分析(上) | 汽车质量管理笔记...
- 宝宝泡药浴和直接吃药有什么区别吗?
- 无法启动正在运行的oracle,Oracle侦听器未运行,无法启动
- python xlrd使用_在Python中使用xlrd以文本形式读取数值Excel数据
- php扣费到期自动续期,PHP 处理苹果的自动续签
- 冒泡排序和纯指针的冒泡排序
热门文章
- 宝尚在线炒股 12.22 午评
- 学编程需要的电脑配置
- 未转变者服务器物品建筑id,未转变者建筑物id是什么 | 手游网游页游攻略大全...
- win10禁用快速启动装linux,win10如何关闭快速启动
- 1218学习笔记——kvm上vm+vtpm(IMA)
- 计算机usb接口充电效率差,比充电器还省电 实测主板关机充电神技
- UI设计新手必知的字体设计规范!
- Python 图片处理模块之PIL
- 15个在线检测网站工具十分好用
- 达内终端端mysql命令_如何从Windows命令行启动MySQL