1 条题解

  • 0
    @ 2024-11-10 20:48:35

    题解:

    本题可以建立一个有向图,如果 A    BA \implies B ,就视作有一条边。然后跑一遍floyd算法。只要距离不是无穷大,也就是A能到达B,那么 A    BA \implies B ,同时有 B    AB \implies A 的话就是等价的。因此只要花费 O(n3)O(n^3) 的时间预处理就可以回答所有询问。

    #include <bits/stdc++.h>
    #define maxn 205
    using namespace std;
    bool e[maxn][maxn];//邻接表建图
    int main () {
    	int n,m,q;
    	cin>>n>>m>>q;
        //输入
    	for (int i=0;i<m;i++) {
    		int a,b;
    		cin>>a>>b;
    		a--;
    		b--;
    		e[a][b]=1; 
    	}
        //自己能推出自己
    	for (int i=0;i<n;i++) {
    		e[i][i]=1;
    	}
        //floyd
    	for (int i=0;i<n;i++) {
    		for (int j=0;j<n;j++) {
    			for (int k=0;k<n;k++) {
    				if (e[j][i]&&e[i][k]) {
    					e[j][k]=1;
    				}
    			}
    		}
    	}
        //询问
    	for (int i=0;i<q;i++) {
    		int a,b;
    		cin>>a>>b;
    		a--;
    		b--;
    		if (e[a][b]&&e[b][a]) {
    			cout<<1;
    		} else {
    			cout<<0;
    		}
    		cout<<endl;
    	}
        return 0;
    }
    
    • 1

    信息

    ID
    221
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    48
    已通过
    14
    上传者