<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>

import collections
class Solution:
    def isPossible(self, n: int, edges: List[List[int]]) -> bool:
        count = collections.defaultdict(int)
        connected = collections.defaultdict(set)
        visited = set()

        for x, y in edges:
            count[x] += 1
            count[y] += 1
            connected[x].add(y)
            connected[y].add(x)
        odd = []
        even = []

        for i in range(1, n+1):
            if i not in count:
                even.append(i)
            if count[i] % 2 == 1:
                odd.append(i)
            else: even.append(i)
        print(odd, even, connected)
        
        if len(odd) > 4:
            return False
        if len(odd) == 0:
            return True
        
        def helper(x, y):
            if x not in connected or y not in connected[x]:
                # print(x, y)
                return True
            return False
        
        if len(odd) % 2 == 1:
            return False
        if len(odd) == 2:
            a, b = odd
            if a not in connected or b not in connected[a]:
                return True
            for e in even:
                if helper(e, a) and helper(e, b):
                    return True
            return False

        

        if len(odd) == 4:
            a, b, c, d = odd
            if (helper(a, b) and helper(c, d)) or (helper(a, c) and helper(b, d)) or (helper(a, d) and helper(b, c)):
                return True
            return False

        
        # count = 0
        # candidates = set()
        # for i in range(2):
        #     for j in range(len(odd)):
        #         for k in range(j+1, len(odd)):
        #             if odd[j] not in candidates and odd[k] not in candidates:
        #                 if odd[j] not in connected or odd[k] not in connected[odd[j]]:
        #                     connected[odd[j]][odd[k]] = True
        #                     connected[odd[k]][odd[j]] = True
        
        # # if helper(odd, 0):
        # #     return True
        # if len(odd) > 2 or len(odd) == 1:
        #     return False
        # for e in even:
        #     if not connected[e][odd[0]] and not connected[e][odd[1]]:
        #         return True
        # return False
1385