#################################################################
##  CS 3600 (Winter 2025), Assignment #3                       ##
##  Program File Name: myNRCClasses.py                         ##
##       Student Name: Todd Wareham                            ##
##         Login Name: harold                                  ##
##              MUN #: 8008765                                 ##
#################################################################

## Provided classes for Assigment #3.
##
##      *** DO NOT CHANGE THE CODE IN THIS FILE ***
##

import math
import copy
from myNRCFunctions import *


## Undirected graph class

## Attributes:
##   int[][]  M (graph adjacency matrix; edge = 1, no edge = 0)
##   int      numVertces, numEdges
##   int      itemNum
##   Boolean  enumerating (True = edge enumeration started;
##                         False = edge nenumeration not started)

class UGraph:

   def __init__(self, filename):
      f = open(filename, "r+")
      self.numVertices = int(f.readline().strip())
      self.M = []
      for i in range(self.numVertices):
         temp = [0 for j in range(self.numVertices)]
         self.M.append(temp)
      self.numEdges = 0
      for i in range(self.numVertices):
         for vertex in (f.readline().strip().split(":"))[1].split():
            self.M[i][int(vertex)-1] = 1
            self.numEdges = self.numEdges + 1
      f.close()
      self.numEdges = self.numEdges/2
      self.enumerating = False
      

   def getNumVertices(self):
      return(self.numVertices)

   def getNumEdges(self):
      return(self.numEdges)

   def getW(self):
      W = copy.deepcopy(self.M)
      for i in range(self.numVertices):
         for j in range(self.numVertices):
            if (W[i][j] == 0):
               W[i][j] = math.inf
      return(W)

   def isEdge(self, x, y):
      return(True if self.M[min(x,y)][max(x,y)] == 1 else False)

   def startEdgeEnum(self):
      self.enumerating = True
      self.enumi = 0
      self.enumj = 0

   def nextEdge(self):
      if (self.enumerating):
          while (self.enumi < self.numVertices):
              self.enumj = self.enumj + 1
              while (self.enumj < self.numVertices):
                  if (self.M[self.enumi][self.enumj] == 1):
                     return([self.enumi + 1, self.enumj + 1])
                  self.enumj = self.enumj + 1
              self.enumi = self.enumi + 1
              self.enumj = self.enumi
      self.enumerating = False
      return([math.inf, math.inf])

   def print(self):
      printIntMatrix(self.M)

