<p>In a town, there are <code>n</code> people labeled from <code>1</code> to <code>n</code>. There is a rumor that one of these people is secretly the town judge.</p>

<p>If the town judge exists, then:</p>

<ol>
	<li>The town judge trusts nobody.</li>
	<li>Everybody (except for the town judge) trusts the town judge.</li>
	<li>There is exactly one person that satisfies properties <strong>1</strong> and <strong>2</strong>.</li>
</ol>

<p>You are given an array <code>trust</code> where <code>trust[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> representing that the person labeled <code>a<sub>i</sub></code> trusts the person labeled <code>b<sub>i</sub></code>. If a trust relationship does not exist in <code>trust</code> array, then such a trust relationship does not exist.</p>

<p>Return <em>the label of the town judge if the town judge exists and can be identified, or return </em><code>-1</code><em> otherwise</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> n = 2, trust = [[1,2]]
<strong>Output:</strong> 2
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> n = 3, trust = [[1,3],[2,3]]
<strong>Output:</strong> 3
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> n = 3, trust = [[1,3],[2,3],[3,1]]
<strong>Output:</strong> -1
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= n &lt;= 1000</code></li>
	<li><code>0 &lt;= trust.length &lt;= 10<sup>4</sup></code></li>
	<li><code>trust[i].length == 2</code></li>
	<li>All the pairs of <code>trust</code> are <strong>unique</strong>.</li>
	<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
	<li><code>1 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= n</code></li>
</ul>

class Solution {
public:
    bool dfs( vector< vector< int > > & adj, int u, int judge, vector< bool > & vis ) {
        if( u == judge ) return true ;
        if( true == vis[ u ] ) return false ;
        vis[ u ] = true ;
        for( int & neighbor : adj[ u ] ) {
            return dfs( adj, neighbor, judge, vis ) ;
        }
        return false ;
    }

    int findJudge(int n, vector<vector<int>>& trust) {
        vector< vector< int > > adj( n + 1 ) ;
        unordered_set< int > ust ;
        unordered_map< int, int > vst ;
        for( int i = 1; i <= n; ++ i ) {
            ust.insert( i ) ;
        }

        for( vector< int > & relation : trust ) {
            int u = relation[ 0 ] ;
            int v = relation[ 1 ] ;
            adj[ u ].push_back( v ) ;
            ust.erase( u ) ;
            ++ vst[ v ] ;
        }
        if( ust.size() != 1 ) return -1 ;
        int ans = -1 ;
        int u_judge = * ust.begin() ;
        int ct = vst[ u_judge ] ;
        return ct == n - 1 ? u_judge : - 1 ;
    //    cout<< judge <<" " ;
        // for( int i = 1 ; i <= n; ++i ) {
        //     vector< bool > vis( n + 1, false ) ;
        //     if( i != judge ) if( false == dfs( adj, i, judge, vis ) ) return - 1 ;
        // }
        // return judge ;
    }
};
67446