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

相关推荐

舂锋:不能投什么岗都用一份简历,一般都是要看企业的岗位需求来写职业技能或者是项目经历,跟岗位相关的就写多一点。
点赞 评论 收藏
分享
大厂的边缘业务去了也没啥用,也得不到任何成长,尤其是审核、中台这种价值产出不清楚的,别被大厂光环蒙蔽了双眼,如果你找实习工作,优先找"离钱近的业务",钱多的业务福利年终奖啥的都不会差的
陈100:呵呵。 你在大厂工作2年,后面准备好,可以随便跳很多公司。 去小厂,现在拿到所谓多的钱,有啥用啊,未来没有了。 而且应届生,工作没几年的,也不是赚钱的时间。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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