<p>There is an <strong>undirected</strong> graph consisting of <code>n</code> nodes numbered from <code>1</code> to <code>n</code>. You are given the integer <code>n</code> and a <strong>2D</strong> array <code>edges</code> where <code>edges[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> indicates that there is an edge between nodes <code>a<sub>i</sub></code> and <code>b<sub>i</sub></code>. The graph can be disconnected.</p>

<p>You can add <strong>at most</strong> two additional edges (possibly none) to this graph so that there are no repeated edges and no self-loops.</p>

<p>Return <code>true</code><em> if it is possible to make the degree of each node in the graph even, otherwise return </em><code>false</code><em>.</em></p>

<p>The degree of a node is the number of edges connected to it.</p>

<p>&nbsp;</p>
<p><strong>Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/10/26/agraphdrawio.png" style="width: 500px; height: 190px;" />
<pre>
<strong>Input:</strong> n = 5, edges = [[1,2],[2,3],[3,4],[4,2],[1,4],[2,5]]
<strong>Output:</strong> true
<strong>Explanation:</strong> The above diagram shows a valid way of adding an edge.
Every node in the resulting graph is connected to an even number of edges.
</pre>

<p><strong>Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/10/26/aagraphdrawio.png" style="width: 400px; height: 120px;" />
<pre>
<strong>Input:</strong> n = 4, edges = [[1,2],[3,4]]
<strong>Output:</strong> true
<strong>Explanation:</strong> The above diagram shows a valid way of adding two edges.</pre>

<p><strong>Example 3:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/10/26/aaagraphdrawio.png" style="width: 150px; height: 158px;" />
<pre>
<strong>Input:</strong> n = 4, edges = [[1,2],[1,3],[1,4]]
<strong>Output:</strong> false
<strong>Explanation:</strong> It is not possible to obtain a valid graph with adding at most 2 edges.</pre>

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

<ul>
	<li><code>3 &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>2 &lt;= edges.length &lt;= 10<sup>5</sup></code></li>
	<li><code>edges[i].length == 2</code></li>
	<li><code>1 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= n</code></li>
	<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
	<li>There are no repeated edges.</li>
</ul>

class Solution:
    def isPossible(self, n: int, edges: List[List[int]]) -> bool:
        graph = Counter()
        edges_map = defaultdict(set)
        for n1, n2 in edges:
            graph[n1] += 1
            graph[n2] += 1
            if n1 == 2 and n2 == 3:
                print("hi")
            edges_map[n1].add(n2)
            edges_map[n2].add(n1)
        odd_nodes = []
        for g in graph:
            if graph[g] % 2 != 0:
                odd_nodes.append(g)
        print(odd_nodes)
        print(edges_map[2])
        print(edges_map[3])
        if len(odd_nodes) == 0:
            return True
        else:
            if len(odd_nodes) == 2:
                n1 = odd_nodes[0]
                n2 = odd_nodes[1]

                n1_not_connected = set(range(1, n+1)) - edges_map[n1]
                n2_not_connected = set(range(1, n+1)) - edges_map[n2]
                
                return (n1 not in edges_map[n2] and n2 not in edges_map[n1]) or len(n1_not_connected.intersection(n2_not_connected))
            elif len(odd_nodes) == 4:
                n1 = odd_nodes[0]
                n2 = odd_nodes[1]
                n3 = odd_nodes[2]
                n4 = odd_nodes[3]    

                return (n1 not in edges_map[n2] and n3 not in edges_map[n4]) or (n1 not in edges_map[n3] and n2 not in edges_map[n4]) or (n1 not in edges_map[n4] and n2 not in edges_map[n3])



        # 3 cases: 
        # 1) num odds 0 
        # 2) num odds 2 and there's no edge between them
        # 3) num odds 4 and none of them are connected

        return False
        
57640