POJ3275 Ranking the Cows(floyd传递闭包)

Ranking the Cows

https://ac.nowcoder.com/acm/problem/107872

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;
}
全部评论

相关推荐

11-29 00:55
门头沟学院
区域赛银,邀请赛金,打算十二月打下Java基础、背点八股、写个外卖后去投福建小厂的寒假实习,简历应该怎么写呢?以及福州/和厦门有推荐的小厂吗?
牛客53210502...:简历一页:把区域银,邀请赛金标粗,其他的奖除非凑一页否则没有必要写。或者多页:每个站一行这样都列出来。项目经历看看牛客其他人是怎么写的,写的不好呢。简历打磨好按部就班没问题的
点赞 评论 收藏
分享
安静的鲸鱼offer...:神仙级别hr,可遇不可求,甚至他可能也是突然有感而发。只能说遇上是件幸事。
秋招开始捡漏了吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务