POJ3275 Ranking the Cows

题意:
有N个数字,已经比较了M对(x,y),其中x>y, 问至少再需要比较多少对数字,就能
把N个数按大小有序的排列起来

分析:
如果x>y,就在x和y之间连一条单向边,然后用floyd算法(floyd传递闭包),

AC代码:

#include <bitset>
#include <cstdio>

using namespace std;

int n, m, a, b, ans;
bitset<1005> bi[1005];//要用bitset来存01矩阵,可以省掉最外面的一层for循环,不然会超时
//bi[i][j] = 1,表示i和j相连(大小确定)

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d%d", &a, &b);
        bi[a][b] = 1;
        //注意是单向边,只需要bi[a][b] = 1,不需要bi[b][a] = 1;
    }
    //floyd算法
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            if(i != j)
            {
                //如果j可以i,则i可以到达的点j都可以到达,所以或一下
                if(bi[j][i])    bi[j] |= bi[i];
            }
        }
    }
    //找出有多少个点没有相连
    //注意第二个循环的其实条件,不然ans会变大
    //对于i到j,只要bi[i][j]和bi[j][i]其中一个是1即可表示两点相连,因为连的是单向边
    for(int i = 1; i <= n; ++i)
    {
        for(int j = i + 1; j <= n; ++j)
        {
            if(!bi[i][j] && !bi[j][i])  ans++;
        }
    }
    printf("%d\n", ans);
    return 0;
}