题意:将n头牛产奶速度又快到慢排序,已经比较了m对牛,问还至少需要多少次比较。
题解:n头牛如果排序完成,应该有C(n,2)关系已知,即任意两头牛的速度都知道了。然后可以从已经比较了的m对牛中算出可以推导出多少对牛已经知道了,推导方法可以参考floyd最短路,然后用C(n,2)减去它就是答案。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int head[2][1005],nc[2]; 6 struct Edge 7 { 8 int to,next; 9 }edge[2][1001000]; 10 void add(int a,int b,int k) 11 { 12 edge[k][nc[k]].to=b;edge[k][nc[k]].next=head[k][a];head[k][a]=nc[k]++; 13 } 14 bool dist[1005][1005]; 15 int main() 16 { 17 int n,m,ans; 18 while(scanf("%d%d",&n,&m)!=EOF) 19 { 20 memset(head,-1,sizeof(head)); 21 ans=nc[0]=nc[1]=0; 22 memset(dist,false,sizeof(dist)); 23 for(int a,b,i=0;i<m;i++) 24 { 25 scanf("%d%d",&a,&b); 26 if(dist[a][b]) 27 continue; 28 add(a,b,0); 29 add(b,a,1); 30 dist[a][b]=true; 31 ans++; 32 } 33 for(int k=1,a,b;k<=n;k++) 34 { 35 for(int i=head[1][k];i!=-1;i=edge[1][i].next) 36 { 37 a=edge[1][i].to; 38 for(int j=head[0][k];j!=-1;j=edge[0][j].next) 39 { 40 b=edge[0][j].to; 41 if(dist[a][b]) 42 continue; 43 dist[a][b]=true; 44 ans++; 45 add(a,b,0); 46 add(b,a,1); 47 } 48 } 49 } 50 printf("%d\n",n*(n-1)/2-ans); 51 } 52 return 0; 53 }