G = read_file(filename) start_time = time.time() G.preprocess() PQ = MaxHeap() for i in range(G.N): PQ.update(i, G.N * G.N) S = set() cur_val = G.N * G.N used = set() for curr_budget in range(budget): while True: cur, val, aux = PQ.pop() if cur == -1: break if cur in used: continue new_val = G.avg_dist(S.union(set([cur]))) if cur_val - new_val == val: S.add(cur) cur_val = new_val used.add(cur) for y in G.G[cur]: used.add(y) break PQ.update(cur, cur_val - new_val) end_time = time.time() total_time = end_time - start_time avg_dist = cur_val #print S print total_time, avg_dist
for i in range(G.N): mg1 = G.avg_dist(set([i])) prev_best = cur_best if cur_best is not None: mg2 = G.avg_dist(set([i]).union(set([cur_best]))) else: mg2 = mg1 flag = 0 PQ.update((i, mg1, prev_best, mg2, flag), mg1) if mg1 < cur_val: cur_val = mg1 cur_best = i # update while len(seed) < budget: val, dist = PQ.pop() u = val[0] mg1 = val[1] prev_best = val[2] mg2 = val[3] flag = val[4] if flag == len(seed): seed = seed.union(set([u])) last_seed = u if cur_val != mg1: print "ouch",u, len(seed) continue elif prev_best == last_seed: mg1 = mg2 else: withU = seed | set([u])