#include <iostream>
#include <vector>
using namespace std;
class Solution {
int n;
vector<vector<int>> adjList;
bool directed = true;
public:
bool dfs(int v,
vector<vector<int>>& adjList,
vector<bool>& discovered,
vector<bool>& processed,
vector<int>& parent)
{
bool ans = false;
discovered[v] = true;
for(auto x : adjList[v])
{
if(!discovered[x])
{
parent[x] = v;
ans |= dfs(x, adjList, discovered, processed, parent);
}
else if((!processed[x] && parent[v]!=x) || directed)
{
if(parent[x]!=v)
{
return true;
}
}
}
processed[v] = true;
return ans;
}
bool validTree(int n, vector<vector<int>>& edges) {
this->n = n;
adjList.resize(n);
vector<bool> discovered(n, false);
vector<bool> processed(n, false);
vector<int> parent(n, -1);
for(auto& x : edges)
{
adjList[x[0]].emplace_back(x[1]);
}
bool ans = false;
for(int i = 0; i < n; ++i)
{
if(!discovered[i])
{
ans |= (dfs(i, adjList, discovered, processed, parent));
if(ans)
return ans;
}
}
return ans;
}
};
int main() {
int n = 4;
vector<vector<int>> edges(n);
edges[0] = {0,2};
edges[1] = {3,0};
edges[2] = {3,1};
edges[3] = {1,2};
Solution s;
cout<<s.validTree(n,edges)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU29sdXRpb24gewogICAgaW50IG47CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGFkakxpc3Q7CiAgICBib29sIGRpcmVjdGVkID0gdHJ1ZTsKcHVibGljOgogICAgICAgICBib29sIGRmcyhpbnQgdiwgCiAgICAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIGFkakxpc3QsCiAgICAgICAgIHZlY3Rvcjxib29sPiYgZGlzY292ZXJlZCwKICAgICAgICAgdmVjdG9yPGJvb2w+JiBwcm9jZXNzZWQsCiAgICAgICAgIHZlY3RvcjxpbnQ+JiBwYXJlbnQpCgkJeyAgICAgCgkJICAgIGJvb2wgYW5zID0gZmFsc2U7CgkJICAgIGRpc2NvdmVyZWRbdl0gPSB0cnVlOwoJCQoJCSAgICBmb3IoYXV0byB4IDogYWRqTGlzdFt2XSkKCQkgICAgewoJCSAgICAgICAgaWYoIWRpc2NvdmVyZWRbeF0pCgkJICAgICAgICB7CgkJICAgICAgICAgICAgcGFyZW50W3hdID0gdjsgIAoJCSAgICAgICAgICAgIGFucyB8PSBkZnMoeCwgYWRqTGlzdCwgZGlzY292ZXJlZCwgcHJvY2Vzc2VkLCBwYXJlbnQpOwoJCSAgICAgICAgfQoJCSAgICAgICAgZWxzZSBpZigoIXByb2Nlc3NlZFt4XSAmJiBwYXJlbnRbdl0hPXgpIHx8IGRpcmVjdGVkKQoJCSAgICAgICAgewoJCSAgICAgICAgICAgIGlmKHBhcmVudFt4XSE9dikKCQkgICAgICAgICAgICB7CgkJICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0KCQkgICAgfQoJCQoJCSAgICBwcm9jZXNzZWRbdl0gPSB0cnVlOwoJCSAgICByZXR1cm4gYW5zOwoJCX0KCiAgICBib29sIHZhbGlkVHJlZShpbnQgbiwgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgZWRnZXMpIHsKICAgICAgICB0aGlzLT5uID0gbjsKICAgICAgICBhZGpMaXN0LnJlc2l6ZShuKTsKICAgICAgICB2ZWN0b3I8Ym9vbD4gZGlzY292ZXJlZChuLCBmYWxzZSk7CiAgICAgICAgdmVjdG9yPGJvb2w+IHByb2Nlc3NlZChuLCBmYWxzZSk7CiAgICAgICAgdmVjdG9yPGludD4gcGFyZW50KG4sIC0xKTsKCgkgICAgZm9yKGF1dG8mIHggOiBlZGdlcykKICAgICAgICB7CiAgICAgICAgICAgIGFkakxpc3RbeFswXV0uZW1wbGFjZV9iYWNrKHhbMV0pOwogICAgICAgIH0KICAgICAgIAoJCWJvb2wgYW5zID0gZmFsc2U7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCFkaXNjb3ZlcmVkW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbnMgfD0gKGRmcyhpLCBhZGpMaXN0LCBkaXNjb3ZlcmVkLCBwcm9jZXNzZWQsIHBhcmVudCkpOwogICAgICAgICAgICAJaWYoYW5zKQogICAgICAgICAgICAJCXJldHVybiBhbnM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBhbnM7CiAgICB9Cgp9OwoKCmludCBtYWluKCkgewoJaW50IG4gPSA0OwoJdmVjdG9yPHZlY3RvcjxpbnQ+PiBlZGdlcyhuKTsKCWVkZ2VzWzBdID0gezAsMn07CgllZGdlc1sxXSA9IHszLDB9OwoJZWRnZXNbMl0gPSB7MywxfTsKCWVkZ2VzWzNdID0gezEsMn07CglTb2x1dGlvbiBzOwoJY291dDw8cy52YWxpZFRyZWUobixlZGdlcyk8PGVuZGw7CgkKCXJldHVybiAwOwp9Cg==