POJ 3275

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

你可能感兴趣的:(poj)