Thanks a lot, I get it now.

On 06/02/2014 12:27 PM, Luke Pebody wrote:
I didn't work it out during the round, but my solution involves using the Maximum Flow - Minimum Cut theorem to say that the maximum flow is equal to the number of vertices you need to remove for no flow to be possible.

Now any set of vertices that cut off all flow will start at the left edge, then move through some number (possibly 0) of buildings and end up at the right edge.

The number of squares needed to get from building 1 from (top1, left1, bottom1, right1) to (top2, left2, bottom2, right) is
 max(top1-1-bottom2,top2-1-bottom1,left1-1-right2,left2-1-right1).

So:
add 2 new buildings, the first representing the left edge at (0,-1,height-1,-1) and the second representing the right edge at (0,width,height-1,width), and find the shortest path from the left building to the right building using the above metric. You could use Djikstra's Algorithm

The code I wrote that solves it (using my Python code jam wrapper that can be found at http://jamftw.blogspot.co.uk/2012/05/python-code-jam-wrapper.html) is:

def reader(inFile):
    (w,h,b) = inFile.getInts()
boxes = [((x0,y0),(x1,y1)) for i in xrange(b) for [x0,y0,x1,y1] in [inFile.getInts()]]
    return (w, h, boxes)

from fractions import gcd

def distance(((x0,y0),(x1,y1)),((x2,y2),(x3,y3))):
    return max(x2-x1-1,x0-x3-1,y2-y1-1,y0-y3-1)

def solver((w, h, boxes)):
    if len(boxes) == 0:
        return w
    n = len(boxes)
    dists = [x0 for ((x0,y0),(x1,y1)) in boxes]
    stilltodo = set(range(n))
    for i in xrange(n):
        (dist, closest) = min([(dists[i],i) for i in stilltodo])
        stilltodo.remove(closest)
        for k in stilltodo:
dists[k] = min(dists[k], dist + distance(boxes[k], boxes[closest]))
    return min([dists[i] + (w - 1 - boxes[i][1][0]) for i in xrange(n)])

if __name__ == "__main__":
    from GCJ import GCJ
    GCJ(reader, solver, "/Users/luke/gcj/2014/2/c/", "c").run()





On Mon, Jun 2, 2014 at 3:30 PM, Matt Weaver <[email protected] <mailto:[email protected]>> wrote:

    I really enjoyed the problem set for round 2.  I still haven't
    figured out the solution for problem C though, Don't Break the
    Nile.  Can anyone give me the short version while we wait for the
    analysis? I can see how it could be modeled as a maximum flow
    problem, but it would be way too large to be solvable.  I assume
    from the large constraints it should be possible to process
    row-by-row up the river, but any method I can think of breaks down
    on maze-like rivers with dead ends, etc. where it seems like you
    would need to backtrack.

-- 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 [email protected]
    <mailto:google-code%[email protected]>.
    To post to this group, send email to [email protected]
    <mailto:[email protected]>.
    To view this discussion on the web visit
    
https://groups.google.com/d/msgid/google-code/538C8A99.4060400%40mailbolt.com.
    For more options, visit https://groups.google.com/d/optout.


--
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 [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>. To view this discussion on the web visit https://groups.google.com/d/msgid/google-code/CAECKw-P-ed%2B-ADKAUwRGZAaD0V1tEpWt-ku6zuopUx%2Bz2AUw4g%40mail.gmail.com <https://groups.google.com/d/msgid/google-code/CAECKw-P-ed%2B-ADKAUwRGZAaD0V1tEpWt-ku6zuopUx%2Bz2AUw4g%40mail.gmail.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.

--
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-code/538DD186.5030605%40mailbolt.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to