【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相关推荐

  1. POJ 3275 Ranking the Cows (floyd传递闭包)

    Ranking the Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2248   Accepted: 1045 ...

  2. POJ3275 Ranking the Cows【关系闭包】

    Ranking the Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3510 Accepted: 1608 Desc ...

  3. powerquery分组_Power Query系列 - 排序Ranking

    Power Query系列 - 排序Ranking 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 概况: 在数据分析中,我们常常需要对数据进行排序,同时我们想知道某个项目或者产品的排名, ...

  4. P2881 [USACO07MAR]Ranking the Cows G

    P2881 [USACO07MAR]Ranking the Cows G 题目描述 输出格式 Line 1: A single integer that is the minimum value of ...

  5. poj 3275 Ranking the Cows 搜索

    题意:给你n个数和m个大小关系,问给出了这些大小关系之后还有多少对数的大小关系不知道. 分析:根据给出的大小关系建有向边,每次对每个点延有向边搜索到底,确定该边的所有连边关系,最后统计没有关系的边对数 ...

  6. 奶牛排序 cow sort 置换群

    链接:https://ac.nowcoder.com/acm/contest/924/H 来源:牛客网 题目描述 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便 ...

  7. Ranking the Cows(POJ-3275 )

    Problem Description Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positi ...

  8. POJ 2871 整数奇偶排序

    时间限制:  1000ms 内存限制: 65536kB 描述 输入10个整数,彼此以空格分隔 重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到小排列: 2.然后输出其中的偶数 ...

  9. POJ 1094拓补排序

    POJ 1094拓补排序问题,需要加一些判断 #include <cstdio> #include <queue> #include <vector> #inclu ...

最新文章

  1. python cx oracle安装_python3.6的安装及cx_oracle安装
  2. 从iOS证书申请到签名文件生成
  3. ETOPS:双发飞机延伸航程运行
  4. 鸿蒙系统开发者公测,公测尝鲜开启!华为Mate40/P40开始和安卓渐行渐远
  5. python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码
  6. Android开发之assets目录下资源使用总结
  7. ISA server的常见身份验证方式
  8. hdu java_HDU-java实现1176
  9. 如何使用Xcode分析调试在真机运行的UE4 IOS版游戏
  10. Xpath路径表达式
  11. android内核读取file文件
  12. spring yml 配置事务_application.yml与bootstrap.yml的区别
  13. Win10 新机,这些必装软件你拥有了吗?
  14. extjs表格编辑、EditorGridPanel
  15. matlab kappa风险分析,我为什么反对在属性数据MSA中用Kappa分析(上) | 汽车质量管理笔记...
  16. 宝宝泡药浴和直接吃药有什么区别吗?
  17. 无法启动正在运行的oracle,Oracle侦听器未运行,无法启动
  18. python xlrd使用_在Python中使用xlrd以文本形式读取数值Excel数据
  19. php扣费到期自动续期,PHP 处理苹果的自动续签
  20. 冒泡排序和纯指针的冒泡排序

热门文章

  1. 宝尚在线炒股 12.22 午评
  2. 学编程需要的电脑配置
  3. 未转变者服务器物品建筑id,未转变者建筑物id是什么 | 手游网游页游攻略大全...
  4. win10禁用快速启动装linux,win10如何关闭快速启动
  5. 1218学习笔记——kvm上vm+vtpm(IMA)
  6. 计算机usb接口充电效率差,比充电器还省电 实测主板关机充电神技
  7. UI设计新手必知的字体设计规范!
  8. Python 图片处理模块之PIL
  9. 15个在线检测网站工具十分好用
  10. 达内终端端mysql命令_如何从Windows命令行启动MySQL