想的时间比较长所以看题解了= =

原题:

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 奶牛的魅力排名的更多相关文章

  1. Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset

    1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 323  Solved ...

  2. BZOJ1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名

    n<=1000头牛各有一个未知值Ai,已知m<=10000条形如Ax>Ay的不等关系,求将整个序列排序的最少比较次数. Aa>Ab,Ab>Ac -------> A ...

  3. bzoj:1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名

    Description     农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤100 ...

  4. 【dfs】BZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名

    [题目大意] 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他 ...

  5. 【BZOJ】1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名

    [题意]给定n头牛和m对大小关系,求最坏情况下至少还需要比较几对奶牛的大小(在未确定顺序的奶牛对中随机比较) [算法]floyd求传递闭包 [题解]可达说明大小已知,则不可达点对数量就是最少比较次数. ...

  6. bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名【bitset+Floyd传递闭包】

    把关系变成有向边,稍微想一下就是要求在有向图中不能到达的点对个数,这个可以用Floyd传递闭包来做,但是n^3的复杂度跑不了1000 考虑bitset优化! 因为传递过程只会出现0和1,用bitset ...

  7. 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 ...

  8. poj 3275 "Ranking the Cows"(DFS or Floyd+bitset<>)

    传送门 题意: 农场主 FJ 有 n 头奶牛,现在给你 m 对关系(x,y)表示奶牛x的产奶速率高于奶牛y: FJ 想按照奶牛的产奶速率由高到低排列这些奶牛,但是这 m 对关系可能不能精确确定这 n ...

  9. 【BZOJ1720】[Usaco2006 Jan]Corral the Cows 奶牛围栏 双指针法

    [BZOJ1720][Usaco2006 Jan]Corral the Cows 奶牛围栏 Description Farmer John wishes to build a corral for h ...

随机推荐

  1. php将中文符号全部替换为英文符号

    php将中文符号全部替换为英文符号 一.总结 一句话总结:可以用简单替换和规律替换 简单替换 str_replace() 规律替换 均相差 65248 方法一:简单替换(php代码) $val1=st ...

  2. 42 前端HTML

    HTML 1.  概念       HTML  超文本标记语言(Hypertext Markup Language, HTML)是一种用于创建网页的标记语言  . 2.标签 Meta标签 <me ...

  3. NOJ-1581 筷子 (线性DP)

    题目大意:有n支筷子,已知长度,定义一双筷子的质量等于长度的平方差,问能否分成k双?若能,输出所有筷子的最小质量和. 题目分析:先将筷子按长度从小到大排序,定义状态dp(i,j)表示将前 i 支筷子分 ...

  4. OAF点击事件对页面组件的Required属性不验证

    在实际的需求中,OAF页面上很多字段设置了Required=YES,但是我们在点击某些按钮的时候,并不希望浏览器对其进行验证,可以通过设置 Disable Server Side Validation ...

  5. POJ 2406 KMP 循环节

    给一个字符串.求这个串的最小的循环节的长度. 好像.num = len/(len-next[len]) 就是循环节的长度.如果 len%(len-next[len]) ==0 就是 说字符串长度刚好是 ...

  6. Linux免密码登陆

    A电脑实现不用密码登陆到B电脑! vim /etc/ssh/sshd_config   编辑文件 01.在A电脑上生成ssh密钥 ssh-keygen -t rsa02.把A电脑生成的id_rsa.p ...

  7. SaltStack一键部署负载均衡和高可用

    一.负载均衡的部署 server1    haproxy (调度器) server2    apache server3    nginx 1)在server1上首先安装salt-minion服务.并 ...

  8. mysql5.7高可用架构之MHA

    一.MHA简介 MHA(Master High Availability)目前在mysql高可用方面比较成熟.是一套优秀的作为 mysql高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障 ...

  9. 使用adb命令对手机进行截屏保存到电脑,SDCard

    adb shell /system/bin/screencap -p /sdcard/screenshot.png(保存到SDCard) adb pull /sdcard/screenshot.png ...

  10. 获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()

    GetCurrentDirectory 获得的是当前进程的活动目录(资源管理器决定的),可以用SetCurrentDirectory 修改的. 转自 http://m.blog.csdn.net/bl ...