题意:将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 }