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

from collections import defaultdict 
class Solution:
  def isPossible(self, n: int, edges: List[List[int]]) -> bool:
    # add at most two new edges
    # can form a list of odd edges
    # if theres more than 4 odd edges return false
    # we need to try the following 
    # if theres 1
    # nothing we can do return false
    # if theres 2, 
    # you can try to pair amongst themselves, 
    # if that doesnt work try to see if you can connect the two into any node they arent 
    # connected to
    # if theres 3
    # gotta try to connect them to each other
    # if theres 4, its like case 2 but you gotta try each pair with each other
    # (1,2),(3,4) | (1,3),(2,4) | (1,4), (2,3)
    adjList = defaultdict(list)
    for v1,v2 in edges:
      adjList[v1].append(v2)
      adjList[v2].append(v1)
    for i in range(1,n+1):
      adjList[i]

    oddList = []
    for vertice in adjList.keys():
      if len(adjList[vertice]) % 2 == 1:
        oddList.append(vertice)
    if len(oddList) == 1 or len(oddList) > 4 or len(oddList) == 3:
      return False
    if len(oddList) == 0:
      return True
    if len(oddList) == 2:
      return self.checkTwoCombo(*oddList, adjList)
    if len(oddList) == 4:
      v1, v2, v3, v4 = oddList
      scenario_1 = self.checkFourCombo(v1,v2, adjList) and self.checkFourCombo(v3,v4, adjList)
      scenario_2 = self.checkFourCombo(v1,v3, adjList) and self.checkFourCombo(v2,v4, adjList)
      scenario_3 = self.checkFourCombo(v1,v4, adjList) and self.checkFourCombo(v2,v3, adjList)
      return scenario_1 or scenario_2 or scenario_3
    
  def checkTwoCombo(self, v1: int, v2: int, adjList) -> bool:
    if not v1 in adjList[v2]:
      return True
    for v in adjList.keys():
      if v == v1 or v == v2:
        continue
      if not v1 in adjList[v] and not v2 in adjList[v]:
        return True
    return False

  def checkFourCombo(self, v1: int, v2: int, adjList) -> bool:
    if not v1 in adjList[v2]:
      return True
    return False
1200