Hi guys,

I've been trying question 3 from round 2 last year and am not sure whether I am 
getting a TLE error because I am not fast enough or because of the programming 
language. I believe the following is O(N^3) - if anybody has any ideas that 
would be a big help!:

class Graph:
    def __init__(self, graph):
        self.graph = graph
        self.nodes = len(graph) #- number of nodes

    def dfs_path(self, start, end): #- returns the path from start to end, 
otherwise returns False
        queue = [(start, [start])]
        while queue:
            (vertex, path) = queue.pop()
            for neighbour in self.graph[vertex] - set(path):
                if neighbour == end:
                    return path + [neighbour]
                else:
                    queue.append((neighbour, path + [neighbour]))
        return False

    def reverse_edge(self, v1, v2): #- reverses the edge v1 -> v2 to v2 -> v1
        self.graph[v1].remove(v2)
        self.graph[v2].add(v1)
        

    def mcbm(self):
        n =(self.nodes // 2)
        count = 0
        
        self.graph["source"] = set(range(n)) #-- row nodes are (0, 1, ..., n-1)
        self.graph["sink"] = set()
        
        for node in range(n, 2*n):
            self.graph[node].add("sink") #-- column nodes are (n, n+1, ..., 
2*n-1)
            
        while self.dfs_path("source", "sink"): #-- while there exists a path
            path = self.dfs_path("source", "sink")
            length = len(path)
            
            L = path[1] #-- L exposed node
            R = path[length-2] #-- R exposed node

            count += 1
            self.graph["source"].remove(L) #--- disconnect L, R from source, 
sink
            self.graph[R].remove("sink")

            for i in range(1, length-2): #--- reverse all the edges in path 
between L and R
                self.reverse_edge(path[i], path[i+1])

        return count

def coords_to_graph(coords, n): #--- converts set of coordinates on a n by n 
grid to a graph
    nodes = [int(x) for x in range(2*n)] #--- nodes are (0, n) for rows and (n, 
2n) for cols
    graph = {}
    for node in nodes:
        graph[node] = set()

    for coord in coords: #--- connect the node for row x to the node for column 
y (i.e. node y+n)
        x, y = coord[0], coord[1]
        graph[x].add(y+n) 

    return graph
    
def solve():
    n = int(input())
    colour_dict = {}

    for colour in range(1, 2*n+1): #--- the colours are 1, 2, ..., n and -1, 
-2, ..., n 
        colour_dict[colour] = set() #--- this corresponds to 1, 2, ..., 2n (mod 
2n+1)

    for row in range(n):
        cur_row = [int(x) for x in input().split()]
        for index, value in enumerate(cur_row):
            colour = value % (2*n+1) #--- basically convert the -ve numbers to 
n+1, n+2, ..., 2n
            colour_dict[colour].add((row, index))

    for colour in colour_dict:
        cur_graph = Graph(coords_to_graph(colour_dict[colour], n))  
        result = (len(colour_dict[colour]) - cur_graph.mcbm())
        
        yield result

    

#------
t = int(input())
for case in range(t):
    print ("Case #" + str(case + 1) + ": " + str(sum(solve())))

-- 
You received this message because you are subscribed to the Google Groups 
"Google Code Jam" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-code+unsubscr...@googlegroups.com.
To post to this group, send email to google-code@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-code/844e156a-7e37-4a6a-b37b-41858fc73187%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to