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

原题:

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. getpagesize.c:32: __getpagesize: Assertion `_rtld_global_ro._dl_pagesize != 0' failed

    为arm 编译 mysql , 执行的时候出现了这个问题. 好像是个bug, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=626379 重新编译 ...

  2. SpringBoot 中常用注解@Controller/@RestController/@RequestMapping介绍

    原文 SpringBoot 中常用注解 @Controller/@RestController/@RequestMapping介绍 @Controller 处理http请求 @Controller / ...

  3. 『科学计算』L0、L1与L2范数_理解

     『教程』L0.L1与L2范数 一.L0范数.L1范数.参数稀疏 L0范数是指向量中非0的元素的个数.如果我们用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0,换句话说,让参数W是稀 ...

  4. Linux文件与目录管理(一)

    一.Linux文件与目录管理 1.Linux的目录结构是树状结构,最顶级的目录是根目录/(用"/"表示) 2.Linux目录结构图: /bin:bin是Binary的缩写,这个目录 ...

  5. 简话Angular 05 Angular表单验证

    一句话: 可以使用所有html5表单验证功能,同时Angular还增强了部分验证,支持动态验证 1. 上源码 <div ng-controller="ExampleController ...

  6. 使用 istreambuf_iterator 读取文件内容,赋值给 std::string

    需要一个一个字符输入时考虑使用istreambuf_iterator 假设我们要把一个文本文件拷贝到一个字符串对象中.似乎可以用一种很有道理的方法完成: ifstream inputFile(&quo ...

  7. A*算法 寻路

    转载 :http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx A*算法步骤: 1,把起始格添加到开启列表. 2,重复如下的工作: a) ...

  8. [译].Net 4.5 的五项强大新特性

    本文原文:Five Great .NET Framework 4.5 Features 译者:冰河魔法师 目录 介绍 特性一:async和await 特性二:Zip压缩 特性三:正则表达式执行超时 特 ...

  9. cmake 手册详解

    cmake 手册中文版,后续再相关博客的其他链接中,感谢翻译的好人! https://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_0 ...

  10. SQL2012 创建备份计划

    打开数据库,选择 管理 -> 新建维护计划,填写计划名称 修改计划参数 工具箱->备份数据库任务,拖到计划里 编辑任务 拖动清除数据库任务到计划 编辑清除任务 从备份任务到清除任务拖一个箭 ...