拓扑排序--P2881 [USACO07MAR]排名的牛Ranking the Cows
FJ想按照奶牛产奶的能力给她们排序。现在已知有$N$头奶牛$(1 ≤ N ≤ 1,000)$。FJ通过比较,已经知道了$M(1 ≤ M ≤ 10,000)$对相对关系。每一对关系表示为“X Y”,意指X的产奶能力强于Y。现在FJ想要知道,他至少还要调查多少对关系才能完成整个排序。
这道题和Floyd--P2419 [USACO08JAN]牛大赛Cow Contest有异曲同工之妙啊,但是2419我用的是$floyd$,对于$n^3$的做法,本题的数据范围n<=1000显然只能得到部分分(并不会bitset优化):
先说说$floyd$的60分作法:考虑我们如何能确定一头牛的排名?即本牛和其他所有牛的关系都确定。
1:预处理:输入$a$和$b$,$s[a][b]=1$表示$a$赢了$b$
2:$floyd$:如果$i$赢了$t$,$t$赢了$j$,$i$就赢了$j$($t$可以看做一个中转接点)
3:统计答案:如果俩头牛有一头赢了,那么另一头就输了,俩头牛的关系确定,而他不会自我矛盾,所以如果判断到两头牛没有一头赢,那么两头牛的关系不确定,答案+1,然后标记两头牛的关系确定(否则答案会重复)
代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;
int n,m,a,b;
int s[][];
void Floyd(){
for (int t = ;t <= n;t++){
for (int i = ;i <= n;i++){
for (int j = ;j <= n;j++){
if (s[i][t]&&s[t][j])
s[i][j]=;
}
}
}
}
int main(){
int ans=;
scanf ("%d%d",&n,&m)
for (int i = ;i <= m;i++) {
scanf ("%d%d",&a,&b);
s[a][b]=;
}
Floyd();
for(int i = ;i <= n;i++){
for (int j = ;j <= n;j++){
if (i==j)continue;
if (s[i][j]==&&s[j][i]==){
ans++;
s[i][j]=;
}
}
}
cout<<ans;
return ;
}
拓扑作法:
1.预处理:构建一个图,从一头牛(节点)可以走到被他打败的牛(节点) $f[a][b]=1$,$a$打败了$b$,$degree[b]$++(被打败的牛(节点)的入度+1)
2.$bfs$(拓扑):从一个入度为0的节点出发(没有被打败过),由于我们构建的一个图,他的性质为当前节点打败了他的子节点,那么当前节点也打败了他子节点的子节点 $if(f[i][x])f[i][edge[k].to]=1$ 把子节点的入度减一
3.统计答案:如果俩头牛有一头赢了,那么另一头就输了,俩头牛的关系确定,而他不会自我矛盾,所以如果判断到两头牛没有一头赢,那么两头牛的关系不确定,答案+1,然后标记两头牛的关系确定(否则答案会重复)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+;
struct node{int to,next;}edge[N*];
int head[N],tot,degree[N];
bool f[N][N],vis[N],in[N];
int n,m,x,y,z,ans;
void add(int x,int y){
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
}
void bfs(){
queue<int>Q;
for(int i=;i<=n;i++)if(!degree[i])Q.push(i);
while(!Q.empty()){
int x=Q.front();Q.pop();vis[x]=;
for(int k=head[x];k;k=edge[k].next){
if(vis[edge[k].to])continue;
for(int i=;i<=n;i++)if(f[i][x])f[i][edge[k].to]=;
degree[edge[k].to]--;
if(degree[edge[k].to]==)Q.push(edge[k].to);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d",&x,&y),add(x,y),f[x][y]=,degree[y]++;
bfs();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)if(!f[i][j]&&!f[j][i]&&i!=j)ans++,f[i][j]=;
}
printf("%d",ans);
}
拓扑排序--P2881 [USACO07MAR]排名的牛Ranking the Cows的更多相关文章
- 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)
题意 题目链接 Sol 显然如果题目什么都不说的话需要\(\frac{n * (n - 1)}{2}\)个相对关系 然后求一下传递闭包减掉就行了 #include<bits/stdc++.h&g ...
- 洛谷 P2881 [USACO07MAR]排名的牛Ranking the Cows
题应该是假的...先不做了 https://www.cnblogs.com/Blue233333/p/7249057.html 比如输入5 0,答案是10,但可以比较8次就出来.就是在一个已知有序数列 ...
- 拓扑排序/DP【洛谷P2883】 [USACO07MAR]牛交通Cow Traffic
P2883 [USACO07MAR]牛交通Cow Traffic 随着牛的数量增加,农场的道路的拥挤现象十分严重,特别是在每天晚上的挤奶时间.为了解决这个问题,FJ决定研究这个问题,以能找到导致拥堵现 ...
- 洛谷P2017 [USACO09DEC]晕牛Dizzy Cows [拓扑排序]
题目传送门 晕牛Dizzy Cows 题目背景 Hzwer 神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. 题目描述 The cows have taken to racing each o ...
- 牛客 51011 可达性统计(拓扑排序,bitset)
牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 1 ...
- sdut 2819 比赛排名(边表 拓扑排序)
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2819 #include <iost ...
- 牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)
题目链接 这个题,一眼看上去就是最短路的题,边权有负环显然不能用dij,然后出题人又卡了spfa,,那怎么办的想点办法啊,好像还有一个拓扑排序可以求最短路吧,这时候正解就已经得到了,就是拓扑排序求最短 ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- 牛客网NOIP赛前集训营-提高组(第六场)-A-最长路[拓扑排序+hash+倍增]
题意 给定一个 \(n\) 点 \(m\) 边的边权非负的有向图,边有字符,求以每个点为开头的最长路字典序最小的路径 \(hash\) 值. \(n,m\leq 10^6\) 分析 首先建反图拓扑排序 ...
随机推荐
- SQL SERVER 2005还原差异备份、日志备份 2012-03-29 11:43
其实要备份,还原最安全最有保障的是完全备份.但是完全备份肯定是需要更多的磁盘空间的开销.尤其是数据量比较大的.比如基数是500M,每天的增长量为10M,那么第一次完全备份是500M,第二次是510M, ...
- 在abp core中出现运行项目时EF获取到的appsetting.json或者appsettings.Production.json中的连接字符串为空
原因:有可能是生成的bin或者debug文件夹下没有将appsetting.json或者appsettings.Production.json文件生成过去 解决方法:手动拷贝过去,或者设置成自动生成过 ...
- 【Python数据挖掘】第六篇--特征工程
一.Standardization 方法一:StandardScaler from sklearn.preprocessing import StandardScaler sds = Standard ...
- Tomcat 8 Invalid character found in the request target. The valid characters are defined in RFC 3986
终极解决方案: Invalid character found in the request target. The valid characters are defined in RFC 3986 ...
- Centos7 安装redis及简单使用
一.redis的介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset( ...
- 如何使用ffmpeg的c语言sdk实现对文件夹的操作
重要函数 打开文件夹:avio_open_dir() 读取文件夹:avio_read_dir() 关闭文件夹:avio_close_dir() 结构体, 操作目录的上下文:AVIODirContext ...
- 学术Essay写作简单且稳定的架构解析
学术essay写作(academic writing),无论是论文还是专著,间架要稳固,才有可读性,才有说服力. 稳,有几个应然特征:部块(parts)关联紧密:部块不外生枝叶:部块之间没有杂质干扰. ...
- Netty实现原理和使用
参考: https://www.jdon.com/concurrent/netty.html Java NIO原理和使用 参考:https://www.jdon.com/concurrent/nio% ...
- RCTF crypto100(1)
题面是一个文件,里面是用base64加密的字符串,如下所示: IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI ...
- Linux 创建网卡子接口
创建网卡子接口,添加IP别名 ifconfig eth0:0 2.2.2.2/24 或 ip addr add 2.2.2.2/24 dev eth0 label eth0:0 清除网卡子接口,删除 ...