【BZOJ1703】【usaco2007margold】ranking the cows 奶牛的魅力排名
想的时间比较长所以看题解了= =
原题:
Fj有N(N<=1000)头牛,每头牛都有独一无二的正整数 魅力值,Fj想让他们按
魅力值排序。
Fj已经知道M(1<=M<=10000)对奶牛的魅力值,但他发现,他还需要再做一张关
于另外C对奶牛的魅力值比较,才能推断出所有奶牛的魅力值的顺序。
现在请你帮他 算出最小的C值。
刚在拓扑排序方向上想,思路是每次选一个入度为0的点,让这个点向其它所有入度为0的点连边,然后这个点就是目前最高点了,然后就可以删掉不管了,所以可以直接删掉这个点
为了保证最坏情况所以每次删掉的点是所有入度为0的点中从这个点出发能到达的点最多的点
然后用堆搞一下,发现答案不对?
手玩小数据没问题,想了将近一下午无果,遵循经很多神犇"想的时间太长就不要再想"的建议,选择看题解
正解是用减法原理,确定完整的关系需要知道n*(n-1)/2条关系,已知的关系就是每个点能到达的点的个数的和,dfs搞一搞就可以了
然后遇到两个小问题,就是下面这两个dfs都是不对的:
/*void dfs(int x){注意这样可能会有重复的
f[x]=1;
for(int i=LINK[x];i;i=e[i].next){
if(!f[e[i].y]) dfs(e[i].y);
f[x]+=f[e[i].y];
}
}*/
/*int dfs(int x){这样也可能会有重复的
int z=1;
for(int i=LINK[x];i;i=e[i].next) z+=dfs(e[i].y);
return z;
}*/
反例很简单,请自己手玩
代码(我直接在原来堆的错误写法上改的,有一个堆还有各种乱搞,所以代码比较长= =):
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
struct ddd{int next,y;}e[]; int LINK[],ltop=,rd[],cd[];
inline void insert(int x,int y){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;cd[x]++;rd[y]++;}
int n,m;
//int QUEUE[1100000],head=0;
int ans=;
bool flag[];
int f[];
int visited[];
int max_heap[],size=;
void push(int x){
max_heap[size]=x;
int current=size,father=(size-)>>;
while(f[max_heap[current]]>f[max_heap[father]] && father>=){
swap(max_heap[current],max_heap[father]);
current=father,father=(current-)>>;
}
size++;
}
void updata(int x){
int lchild=(x<<)+,rchild=(x<<)+;
int max_id=x;
if(lchild<size && f[max_heap[lchild]]>f[max_heap[max_id]]) max_id=lchild;
if(rchild<size && f[max_heap[rchild]]>f[max_heap[max_id]]) max_id=rchild;
if(max_id!=x){
swap(max_heap[x],max_heap[max_id]);
updata(max_id);
}
}
void pop(){
swap(max_heap[],max_heap[size-]);
size--;
updata();
}
/*void dfs(int x){注意这样可能会有重复的:(1,2),(3,2)
f[x]=1;
for(int i=LINK[x];i;i=e[i].next){
if(!f[e[i].y]) dfs(e[i].y);
f[x]+=f[e[i].y];
}
}*/
/*int dfs(int x){这样也可能会有重复的,比如(1,2),(2,3),(1,3)
int z=1;
for(int i=LINK[x];i;i=e[i].next) z+=dfs(e[i].y);
return z;
}*/
int dfs(int x,int y){
int z=;
for(int i=LINK[x];i;i=e[i].next)if(visited[e[i].y]!=y){
visited[e[i].y]=y;
z+=dfs(e[i].y,y);
}
return z;
}
int main(){//freopen("ddd.in","r",stdin);
memset(flag,,sizeof(flag));
cin>>n>>m;
int _left,_right;
while(m --> ){//趋向于
_left=read(),_right=read();
insert(_left,_right);
}
//for(int i=1;i<=n;++i)if(!rd[i]) QUEUE[++head]=i,++cnt;
for(int i=;i<=n;++i) ans+=dfs(i,i)-;
//for(int i=1;i<=n;++i)if(!rd[i]) push(i);
/*for(int i=1;i<=n;++i){
cout<<rd[max_heap[0]]<<endl;
pop();
}*/
/*while(size){
//cout<<ans<<" "<<cnt<<endl;
ans+=size-1;
int max_id=max_heap[0]; pop();
for(int i=LINK[max_id];i;i=e[i].next){
rd[e[i].y]--;
if(!rd[e[i].y]) push(e[i].y);
}
//cout<<max_id<<endl;
}*/
cout<<n*(n-)/-ans<<endl;
return ;
}
【BZOJ1703】【usaco2007margold】ranking the cows 奶牛的魅力排名的更多相关文章
- Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset
1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 323 Solved ...
- BZOJ1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
n<=1000头牛各有一个未知值Ai,已知m<=10000条形如Ax>Ay的不等关系,求将整个序列排序的最少比较次数. Aa>Ab,Ab>Ac -------> A ...
- bzoj:1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
Description 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序. 约翰已经比较了M(1≤M≤100 ...
- 【dfs】BZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名
[题目大意] 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他 ...
- 【BZOJ】1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
[题意]给定n头牛和m对大小关系,求最坏情况下至少还需要比较几对奶牛的大小(在未确定顺序的奶牛对中随机比较) [算法]floyd求传递闭包 [题解]可达说明大小已知,则不可达点对数量就是最少比较次数. ...
- bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名【bitset+Floyd传递闭包】
把关系变成有向边,稍微想一下就是要求在有向图中不能到达的点对个数,这个可以用Floyd传递闭包来做,但是n^3的复杂度跑不了1000 考虑bitset优化! 因为传递过程只会出现0和1,用bitset ...
- poj_3275 Ranking the cows
Ranking the cows Description Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a differe ...
- poj 3275 "Ranking the Cows"(DFS or Floyd+bitset<>)
传送门 题意: 农场主 FJ 有 n 头奶牛,现在给你 m 对关系(x,y)表示奶牛x的产奶速率高于奶牛y: FJ 想按照奶牛的产奶速率由高到低排列这些奶牛,但是这 m 对关系可能不能精确确定这 n ...
- 【BZOJ1720】[Usaco2006 Jan]Corral the Cows 奶牛围栏 双指针法
[BZOJ1720][Usaco2006 Jan]Corral the Cows 奶牛围栏 Description Farmer John wishes to build a corral for h ...
随机推荐
- layedit
layedit.set({ uploadImage: { url: '' //接口url ,type: '' //默认post } }); //注意:layedit.set 一定要放在 build 前 ...
- bzoj2242: [SDOI2011]计算器 BSGS+exgcd
你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...
- django的url的name参数的意义
Templates的链接地址都是根据urlpatterns定义的地址,拼凑成地址字符串,很难看,而且Templates里拼凑成的地址,随着页面的增加而不断增加,一旦在urlpatterns里的某个地址 ...
- Eclipse SVN 合并分支/主干
可以从主干合并到分支,也可以从分支合并到主干,根据需要可以选择合适的选项,如下图:
- OC ARC之循环引用问题(代码分析)
// // main.m // 03-arc-循环引用 // // Created by apple on 13-8-11. // Copyright (c) 2013年 itcast. All ri ...
- 简话Angular 03 Angular内置表达式大全
一句话: 大多数html标签属性和事件都有一个对应的ng指令 说明:这些指令和原生html最大的区别就是可以动态更新.比如一个div的样式用ng-class后,我们就可以随意应用css class. ...
- 流媒体传输协议详解之---RTSP认证
from:http://blog.csdn.net/machh/article/details/52121648 Rtsp认证主要分为两种: 基本认证(basic authentication)和 ...
- 弹出层小插件之(二) layer&layui
其实layer或者layui相对于上次所说的 sweetalert来说不仅仅有弹出层,它有很多的功能,这也大大的提高了我们的开发效率,根据我们项目的实际需要的效果进行选择.下面介绍下Layer的用法吧 ...
- Oracle 将另外一张表的列更新到本表的列
Oracle写法: update temp_agentpay_df q set q.up_batch_bizid=(select c.batch_bizid from temp_df_id c whe ...
- Java——多线程小例子
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...