from operator import itemgetter
import collections
tmp = [(0, 30), (0, 20), (10, 40), (30, 50), (50, 90), (70, 100), ]
aa = sorted(tmp, key=itemgetter(1)) # sort with respect to 1st elem
a = set(aa)
space = 100
d_conn = 15
RTT = d_conn*2
bandwidth = 10
def get_marginal_cost(fragment):
return RTT + (fragment[1] - fragment[0])/bandwidth
def dfs(a, start, path=None):
if path is None:
path = [start, ]
if start[1] == space:
yield path
for frgmt in a - set(path):
l = frgmt[0]
r = frgmt[1]
if start[0] < l <= start[1] <= r:
# if l <= start[1] <= r:
yield dfs(a, frgmt, path + [frgmt, ])
for z in a:
if z[0] == 0:
for output in list(dfs(a, z)):
for outpu in list(output):
for outp in list(outpu):
for out in list(outp):
for ou in list(out):
print list(ou)
ZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgppbXBvcnQgY29sbGVjdGlvbnMKCnRtcCA9IFsoMCwgMzApLCAoMCwgMjApLCAoMTAsIDQwKSwgKDMwLCA1MCksICg1MCwgOTApLCAoNzAsIDEwMCksIF0KYWEgPSBzb3J0ZWQodG1wLCBrZXk9aXRlbWdldHRlcigxKSkgIyBzb3J0IHdpdGggcmVzcGVjdCB0byAxc3QgZWxlbQphID0gc2V0KGFhKQpzcGFjZSA9IDEwMApkX2Nvbm4gPSAxNQpSVFQgPSBkX2Nvbm4qMgpiYW5kd2lkdGggPSAxMAoKZGVmIGdldF9tYXJnaW5hbF9jb3N0KGZyYWdtZW50KToKICAgIHJldHVybiBSVFQgKyAoZnJhZ21lbnRbMV0gLSBmcmFnbWVudFswXSkvYmFuZHdpZHRoCgpkZWYgZGZzKGEsIHN0YXJ0LCBwYXRoPU5vbmUpOgogICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgIHBhdGggPSBbc3RhcnQsIF0KICAgIGlmIHN0YXJ0WzFdID09IHNwYWNlOgogICAgICAgIHlpZWxkIHBhdGgKICAgIGZvciBmcmdtdCBpbiBhIC0gc2V0KHBhdGgpOgogICAgICAgIGwgPSBmcmdtdFswXQogICAgICAgIHIgPSBmcmdtdFsxXQogICAgICAgIGlmIHN0YXJ0WzBdIDwgbCA8PSBzdGFydFsxXSA8PSByOgojICAgICAgICBpZiBsIDw9IHN0YXJ0WzFdIDw9IHI6CiAgICAgICAgICAgIHlpZWxkIGRmcyhhLCBmcmdtdCwgcGF0aCArIFtmcmdtdCwgXSkKCmZvciB6IGluIGE6CiAgICBpZiB6WzBdID09IDA6CiAgICAgICAgZm9yIG91dHB1dCBpbiBsaXN0KGRmcyhhLCB6KSk6CiAgICAgICAgICAgIGZvciBvdXRwdSBpbiBsaXN0KG91dHB1dCk6CiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBsaXN0KG91dHB1KToKICAgICAgICAgICAgICAgICAgICBmb3Igb3V0IGluIGxpc3Qob3V0cCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvdSBpbiBsaXN0KG91dCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBsaXN0KG91KQ==
[(0, 20), (10, 40), (30, 50), (50, 90), (70, 100)]
[(0, 30), (10, 40), (30, 50), (50, 90), (70, 100)]
[0, 30]
[30, 50]
[50, 90]
[70, 100]