牛客挑战赛47 C 条件
思路:首先我们要两个图,一个是一定能到达的,一个是可能到达的,如果我们使用floyd (n^3)就有可能会超时,因为只要求询问能否到达,所以权值只有0和1,那我们可以使用bitset来优化floyd算法的最后一维,第一维是枚举中间节点,第二维是枚举起点,第三维就是枚举终点,我们要优化的就是终点。(思路参考牛客挑战赛47的题解)
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#include <cstdlib>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se second
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define ac cout<<ans<<"\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=1e9+7;
const ll N =1e3+10;
const double eps = 1e-4;
//const double pi=acos(-1);
int n,m1,m2,q;
bitset<N>a[N],b[N],c[N];
void sovle(){cin>>n>>m1>>m2>>q;for(int i=1;i<=n;i++){a[i][i]=1;}for(int i=1;i<=m1;i++) {int u,v;cin>>u>>v;a[u][v]=1;}for(int i=1;i<=m2;i++) {int u,v;cin>>u>>v;b[u][v]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(b[i][j]) continue;else c[i][j]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(a[j][i]) a[j]|=a[i];if(c[j][i]) c[j]|=c[i];}while(q--){int u,v;cin>>u>>v;if(a[u][v]) cout<<"Yes ";else cout<<"No ";if(!c[u][v]) cout<<"No\n";else cout<<"Yes\n";}
}int main()
{iosint t=1;//cin>>t;while(t--){sovle();}return 0;
}