bzoj1703[Usaco2007 Mar]Ranking the Cows 奶牛排名*
Posted YuanZiming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1703[Usaco2007 Mar]Ranking the Cows 奶牛排名*相关的知识,希望对你有一定的参考价值。
bzoj1703[Usaco2007 Mar]Ranking the Cows 奶牛排名
题意:
n头奶牛,知道n对奶牛之间的产奶量大小,问想知道所有奶牛产奶量大小顺序至少还需知道几对。n≤1000。
题解:
每个大小关系看为一条有向边,对每头奶牛进行dfs,求每头奶牛可以到的奶牛数和可以到它的奶牛数之和,用n-1减后就是需要和它比较的奶牛数。最后输出(n*(n-1)-所有牛的结果相加)/2即可。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 1010 7 using namespace std; 8 9 inline int read(){ 10 char ch=getchar(); int f=1,x=0; 11 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} 12 while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar(); 13 return f*x; 14 } 15 struct e{int t,n;}es[maxn*10]; int g[maxn],ess; 16 void pe(int f,int t){es[++ess]=(e){t,g[f]}; g[f]=ess;} 17 int f[maxn*10],t[maxn*10],n,m,sum[maxn],ans; bool vis[maxn]; 18 void dfs(int x,int s){ 19 for(int i=g[x];i;i=es[i].n)if(!vis[es[i].t])sum[s]++,vis[es[i].t]=1,dfs(es[i].t,s); 20 } 21 int main(){ 22 n=read(); m=read(); inc(i,1,m)f[i]=read(),t[i]=read(),pe(f[i],t[i]); 23 inc(i,1,n){memset(vis,0,sizeof(vis)); dfs(i,i);} ess=0; memset(g,0,sizeof(g)); 24 inc(i,1,m)pe(t[i],f[i]); inc(i,1,n){memset(vis,0,sizeof(vis)); dfs(i,i);} 25 ans=n*(n-1); inc(i,1,n)ans-=sum[i]; printf("%d",ans/2); return 0; 26 }
20160927
以上是关于bzoj1703[Usaco2007 Mar]Ranking the Cows 奶牛排名*的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
dfsBZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名
[BZOJ1637][Usaco2007 Mar]Balanced Lineup
bzoj 1637: [Usaco2007 Mar]Balanced Lineup