#include <bits/stdc++.h>
using
namespace
std;
class
Node {
public
:
vector<Node*> neighbors;
int
val;
Node(
int
v)
{
val = v;
neighbors = {};
}
};
void
dfs(Node* root, unordered_map<Node*,
int
>& visited,
vector<Node*>& nodes)
{
if
(visited.find(root) != visited.end())
return
;
visited[root] = 0;
nodes.push_back(root);
for
(Node* n : root->neighbors) {
dfs(n, visited, nodes);
}
}
int
findLongestPath(Node* root,
unordered_map<Node*,
int
>& visited)
{
if
(visited[root] > 0)
return
visited[root];
int
maxi = 0;
for
(Node* n : root->neighbors) {
if
(n->val < root->val) {
maxi = max(maxi, findLongestPath(n, visited));
}
}
visited[root] = maxi + 1;
return
maxi + 1;
}
int
longestIncPath(Node* root)
{
if
(root == NULL)
return
0;
int
maxi = 1;
unordered_map<Node*,
int
> visited;
vector<Node*> nodes;
dfs(root, visited, nodes);
for
(
int
i = 0; i < nodes.size(); i++) {
Node* curr = nodes[i];
if
(visited[curr] == 0) {
findLongestPath(curr, visited);
}
maxi = max(maxi, visited[curr]);
}
return
maxi;
}
int
main()
{
Node* seven =
new
Node(7);
Node* five =
new
Node(5);
Node* four =
new
Node(4);
Node* seventeen =
new
Node(17);
Node* one =
new
Node(1);
Node* two =
new
Node(2);
Node* six =
new
Node(6);
Node* eight =
new
Node(8);
Node* eleven =
new
Node(11);
Node* twelve =
new
Node(12);
one->neighbors.push_back(two);
eleven->neighbors.push_back(two);
two->neighbors.push_back(one);
two->neighbors.push_back(eleven);
two->neighbors.push_back(five);
eight->neighbors.push_back(twelve);
eight->neighbors.push_back(six);
eight->neighbors.push_back(four);
four->neighbors.push_back(eight);
four->neighbors.push_back(seven);
twelve->neighbors.push_back(eight);
six->neighbors.push_back(five);
six->neighbors.push_back(eight);
five->neighbors.push_back(two);
five->neighbors.push_back(seven);
five->neighbors.push_back(six);
seven->neighbors.push_back(five);
seven->neighbors.push_back(four);
seven->neighbors.push_back(seventeen);
seventeen->neighbors.push_back(seven);
cout << (longestIncPath(seven));
return
0;
}