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

相关推荐

会考什么呀?硬件岗
投递大疆等公司10个岗位
点赞 评论 收藏
分享
温州头等大孝子:你们的确很幸福,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
字节跳动开奖368人在聊
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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