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]队列变换*

1629: [Usaco2007 Demo]Cow Acrobats

USACO 2007 NOV Sunscreen

bzoj1710Usaco2007 OpenCheappal 便宜回文