dfsBZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名
Posted Yiyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfsBZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名相关的知识,希望对你有一定的参考价值。
【题目大意】
农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一张关于另外C对奶牛的产奶率比较,才能推断出所有奶牛的产奶率排序。请帮他确定C的最小值。
【思路】
对于M对关系,从产奶率高的往产奶率低的连一条有向边。对于每个节点i,它能抵达的节点的总数即是能比较得出的比它小的奶牛总数。
由于原本总共有N*(N-1)/2对关系,ans=N*(N-1)/2-Σ从该头奶牛能抵达的节点总数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=1000+5; 4 int n,m,ans,tmp; 5 int vis[MAXN]; 6 vector<int> E[MAXN]; 7 8 void dfs(int u,int T) 9 { 10 for (int i=0;i<E[u].size();i++) 11 { 12 int v=E[u][i]; 13 if (vis[v]!=T) 14 { 15 tmp++; 16 vis[v]=T; 17 dfs(v,T); 18 } 19 } 20 } 21 22 void init() 23 { 24 scanf("%d%d",&n,&m); 25 for (int i=1;i<=m;i++) 26 { 27 int u,v; 28 scanf("%d%d",&u,&v); 29 E[u].push_back(v); 30 } 31 } 32 33 void solve() 34 { 35 ans=0; 36 memset(vis,0,sizeof(vis)); 37 for (int i=1;i<=n;i++) 38 { 39 tmp=0; 40 dfs(i,i); 41 ans+=tmp; 42 } 43 ans=(n-1)*n/2-ans; 44 printf("%d\n",ans); 45 } 46 47 int main() 48 { 49 init(); 50 solve(); 51 return 0; 52 }
以上是关于dfsBZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名的主要内容,如果未能解决你的问题,请参考以下文章
bzoj1703[Usaco2007 Mar]Ranking the Cows 奶牛排名*
BZOJ1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*