牛客挑战赛47 C.条件

条件

https://ac.nowcoder.com/acm/contest/10743/C

传送门

一定存在的边放一起跑一边弗洛伊德

然后再加上可能存在的边跑弗洛伊德

这样是

但是由于这里只需要判断是否连通,所以可以使用或运算、

也就是把每个点能到的点看成一个二进制数,这样可以使用优化复杂度

一定存在的边放一起跑一边弗洛伊德

然后再加上可能存在的边跑弗洛伊德

这样是

但是由于这里只需要判断是否连通,所以可以使用或运算、

也就是把每个点能到的点看成一个二进制数,这样可以使用优化复杂度

一定存在的边放一起跑一边弗洛伊德

然后再加上可能存在的边跑弗洛伊德

这样是

但是由于这里只需要判断是否连通,所以可以使用或运算、

也就是把每个点能到的点看成一个二进制数,这样可以使用优化复杂度

#include <bits/stdc++.h>
using namespace std;
int n,m1,m2,q;
bitset<1001>bit1[1001],bit2[1001];
int main()
{
    cin >> n >> m1 >> m2 >>  q;
    for(int i=1;i<=n;i++) 
    for(int j=1;j<=n;j++)
    {
        bit2[i][j]=1;
        if( i==j )    bit1[i][j] = 1;
    }
    for(int i=1;i<=m1;i++)
    {
        int x,y; cin >> x >> y;
        bit1[x][y] = 1;    
    }
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    {
        //正常来说枚举一个j,然后dis[i][j] |= dis[i][k]&&dis[k][j] 
        if( bit1[i][k]==0 )    continue;
        bit1[i] |= bit1[k];
    }
    for(int i=1;i<=m2;i++)
    {
        int x,y; cin >> x >> y; bit2[x][y] = 0;
    }
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    {
        //正常来说枚举一个j,然后dis[i][j] |= dis[i][k]&&dis[k][j] 
        if( bit2[i][k]==0 )    continue;
        bit2[i] |= bit2[k];
    }
    while( q-- )
    {
        int x,y; cin >> x >> y;
        if( bit1[x][y] )    cout << "Yes ";
        else    cout << "No ";
        if( bit2[x][y] )    cout << "Yes\n";
        else    cout << "No\n";
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 15:41
已编辑
淘天 算法工程师 31.0k*16.0
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务