#include <cstdio>
#include <vector>
#include <cstring>
#define MAXV 1000
using namespace std;
typedef vector <int> vi;
// Assuming vertices are labeled 0...V-1
vi G[MAXV], Grev[MAXV];
bool explored[MAXV];
int leader[MAXV], finish[MAXV], order[MAXV], t = -1, parent = 0, V, E;
// running DFS on the reverse graph
void dfs_reverse(int i) {
explored[i] = true;
for(vi::iterator it = Grev[i].begin(); it != Grev[i].end(); it++)
if(!explored[*it])
dfs_reverse(*it);
t++;
finish[i] = t;
}
// running DFS on the actual graph
void dfs(int i) {
explored[i] = true;
leader[i] = parent;
for(vi::iterator it = G[i].begin(); it != G[i].end(); it++)
if(!explored[*it])
dfs(*it);
}
// check if u & v are in the same connected component
bool stronglyConnected(int u, int v) {
return leader[u] == leader[v];
}
int main() {
int i, u, v, countCC, Q;
//freopen("input.txt", "r", stdin);
scanf("%d %d", &V, &E); // Enter the number of vertices & edges
for(i=0; i<E; i++) { // Enter E edges : u -> v
scanf("%d %d", &u, &v);
G[u].push_back(v); // Insert into the adjacency list of the graph
Grev[v].push_back(u); // and the reverse graph
}
printf("Original graph :\n");
for(i=0; i<V; i++) {
if(!G[i].empty()) {
printf("%d : ", i);
for(vi::iterator it = G[i].begin(); it != G[i].end(); it++)
printf("%d ", *it);
printf("\n");
}
}
printf("Reverse graph :\n");
for(i=0; i<V; i++) {
if(!Grev[i].empty()) {
printf("%d : ", i);
for(vi::iterator it = Grev[i].begin(); it != Grev[i].end(); it++)
printf("%d ", *it);
printf("\n");
}
}
// run dfs on the reverse graph to get reverse postorder
memset(explored, false, V*sizeof(bool));
for(i=0; i<V; i++) {
if(!explored[i])
dfs_reverse(i);
order[finish[i]] = i;
}
// run dfs on the actual graph in reverse postorder
memset(explored, false, V*sizeof(bool));
countCC = 0;
for(i=V-1; i>=0; i--)
if(!explored[order[i]]) {
parent = order[i];
dfs(order[i]);
countCC++;
}
printf("No. of strongly connected components : %d\n", countCC);
scanf("%d", &Q); // Enter number of SCC queries
while(Q--) {
scanf("%d %d", &u, &v);
stronglyConnected(u, v) ? printf("YES\n") : printf("NO\n");
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNkZWZpbmUgTUFYViAxMDAwCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHZlY3RvciA8aW50PiB2aTsKCi8vIEFzc3VtaW5nIHZlcnRpY2VzIGFyZSBsYWJlbGVkIDAuLi5WLTEKdmkgR1tNQVhWXSwgR3JldltNQVhWXTsKYm9vbCBleHBsb3JlZFtNQVhWXTsKaW50IGxlYWRlcltNQVhWXSwgZmluaXNoW01BWFZdLCBvcmRlcltNQVhWXSwgdCA9IC0xLCBwYXJlbnQgPSAwLCBWLCBFOwoKLy8gcnVubmluZyBERlMgb24gdGhlIHJldmVyc2UgZ3JhcGgKdm9pZCBkZnNfcmV2ZXJzZShpbnQgaSkgewogICAgZXhwbG9yZWRbaV0gPSB0cnVlOwogICAgZm9yKHZpOjppdGVyYXRvciBpdCA9IEdyZXZbaV0uYmVnaW4oKTsgaXQgIT0gR3JldltpXS5lbmQoKTsgaXQrKykKICAgICAgICBpZighZXhwbG9yZWRbKml0XSkKICAgICAgICAgICAgZGZzX3JldmVyc2UoKml0KTsKICAgIHQrKzsKICAgIGZpbmlzaFtpXSA9IHQ7Cn0KCi8vIHJ1bm5pbmcgREZTIG9uIHRoZSBhY3R1YWwgZ3JhcGgKdm9pZCBkZnMoaW50IGkpIHsKICAgIGV4cGxvcmVkW2ldID0gdHJ1ZTsKICAgIGxlYWRlcltpXSA9IHBhcmVudDsKICAgIGZvcih2aTo6aXRlcmF0b3IgaXQgPSBHW2ldLmJlZ2luKCk7IGl0ICE9IEdbaV0uZW5kKCk7IGl0KyspCiAgICAgICAgaWYoIWV4cGxvcmVkWyppdF0pCiAgICAgICAgICAgIGRmcygqaXQpOwp9CgovLyBjaGVjayBpZiB1ICYgdiBhcmUgaW4gdGhlIHNhbWUgY29ubmVjdGVkIGNvbXBvbmVudApib29sIHN0cm9uZ2x5Q29ubmVjdGVkKGludCB1LCBpbnQgdikgICAgewogICAgcmV0dXJuIGxlYWRlclt1XSA9PSBsZWFkZXJbdl07Cn0KCmludCBtYWluKCkgIHsKICAgIGludCBpLCB1LCB2LCBjb3VudENDLCBROwoKICAgIC8vZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CgogICAgc2NhbmYoIiVkICVkIiwgJlYsICZFKTsgLy8gRW50ZXIgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyAmIGVkZ2VzCiAgICBmb3IoaT0wOyBpPEU7IGkrKykgIHsgICAvLyBFbnRlciBFIGVkZ2VzIDogdSAtPiB2CiAgICAgICAgc2NhbmYoIiVkICVkIiwgJnUsICZ2KTsKICAgICAgICBHW3VdLnB1c2hfYmFjayh2KTsgIC8vIEluc2VydCBpbnRvIHRoZSBhZGphY2VuY3kgbGlzdCBvZiB0aGUgZ3JhcGgKICAgICAgICBHcmV2W3ZdLnB1c2hfYmFjayh1KTsgICAvLyBhbmQgdGhlIHJldmVyc2UgZ3JhcGgKICAgIH0KCiAgICBwcmludGYoIk9yaWdpbmFsIGdyYXBoIDpcbiIpOwogICAgZm9yKGk9MDsgaTxWOyBpKyspICB7CiAgICAgICAgaWYoIUdbaV0uZW1wdHkoKSkgICB7CiAgICAgICAgICAgIHByaW50ZigiJWQgOiAiLCBpKTsKICAgICAgICAgICAgZm9yKHZpOjppdGVyYXRvciBpdCA9IEdbaV0uYmVnaW4oKTsgaXQgIT0gR1tpXS5lbmQoKTsgaXQrKykKICAgICAgICAgICAgICAgIHByaW50ZigiJWQgIiwgKml0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KCiAgICBwcmludGYoIlJldmVyc2UgZ3JhcGggOlxuIik7CiAgICBmb3IoaT0wOyBpPFY7IGkrKykgIHsKICAgICAgICBpZighR3JldltpXS5lbXB0eSgpKSAgIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCA6ICIsIGkpOwogICAgICAgICAgICBmb3Iodmk6Oml0ZXJhdG9yIGl0ID0gR3JldltpXS5iZWdpbigpOyBpdCAhPSBHcmV2W2ldLmVuZCgpOyBpdCsrKQogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCAqaXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQoKICAgIC8vIHJ1biBkZnMgb24gdGhlIHJldmVyc2UgZ3JhcGggdG8gZ2V0IHJldmVyc2UgcG9zdG9yZGVyCiAgICBtZW1zZXQoZXhwbG9yZWQsIGZhbHNlLCBWKnNpemVvZihib29sKSk7CiAgICBmb3IoaT0wOyBpPFY7IGkrKykgIHsKICAgICAgICBpZighZXhwbG9yZWRbaV0pCiAgICAgICAgICAgIGRmc19yZXZlcnNlKGkpOwogICAgICAgIG9yZGVyW2ZpbmlzaFtpXV0gPSBpOwogICAgfQoKICAgIC8vIHJ1biBkZnMgb24gdGhlIGFjdHVhbCBncmFwaCBpbiByZXZlcnNlIHBvc3RvcmRlcgogICAgbWVtc2V0KGV4cGxvcmVkLCBmYWxzZSwgVipzaXplb2YoYm9vbCkpOwogICAgY291bnRDQyA9IDA7CiAgICBmb3IoaT1WLTE7IGk+PTA7IGktLSkKICAgICAgICBpZighZXhwbG9yZWRbb3JkZXJbaV1dKSB7CiAgICAgICAgICAgIHBhcmVudCA9IG9yZGVyW2ldOwogICAgICAgICAgICBkZnMob3JkZXJbaV0pOwogICAgICAgICAgICBjb3VudENDKys7CiAgICAgICAgfQoKICAgIHByaW50ZigiTm8uIG9mIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIDogJWRcbiIsIGNvdW50Q0MpOwogICAgc2NhbmYoIiVkIiwgJlEpOyAvLyBFbnRlciBudW1iZXIgb2YgU0NDIHF1ZXJpZXMKICAgIHdoaWxlKFEtLSkgIHsKICAgICAgICBzY2FuZigiJWQgJWQiLCAmdSwgJnYpOwogICAgICAgIHN0cm9uZ2x5Q29ubmVjdGVkKHUsIHYpID8gcHJpbnRmKCJZRVNcbiIpIDogcHJpbnRmKCJOT1xuIik7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==