import copy import random from time import perf_counter import argparse import sys import math class TimeKeeper: def __init__(self): self.start_time = perf_counter() def is_time_over(self, LIMIT): return (perf_counter() - self.start_time) >= LIMIT def time_now(self): return (perf_counter() - self.start_time) def main(DEBUG): # ユークリッド距離 def euclidean_distance(p1, p2): return sum((a - b) ** 2 for a, b in zip(p1, p2)) ** 0.5 # K-meansクラスタリング def initialize_centroids(points, k): return random.sample(points, k) def assign_clusters(points, centroids): clusters = [] for p in points: ds = [euclidean_distance(p, c) for c in centroids] clusters.append(ds.index(min(ds))) return clusters def update_centroids(points, clusters, k): new_centroids = [] for i in range(k): pts = [points[j] for j in range(len(points)) if clusters[j] == i] if pts: avg = [sum(dim)/len(pts) for dim in zip(*pts)] new_centroids.append(tuple(avg)) return new_centroids def kmeans(points, k, max_iters=100): centroids = initialize_centroids(points, k) for _ in range(max_iters): clusters = assign_clusters(points, centroids) new_centroids = update_centroids(points, clusters, k) if centroids == new_centroids: break centroids = new_centroids return clusters, centroids # Held–Karp TSP def HeldKarp(dists): N = len(dists) dp = [[10**18]*N for _ in range(1< best_sc: best_sc = sc_c tour0 = tour_c best_st = cand improved = True break if improved: break return best_st, tour0, best_sc # ------------ main loop ------------ tk = TimeKeeper() LIMIT = 0.8 random.seed(0) ALPHA = 5 # 入力 N, M = map(int, input().split()) points = [tuple(map(int, input().split())) for _ in range(N)] # グローバル辞書初期化 id_to_xy = {} best_sc = -1 best_labels = best_stations = best_tour = None loop = 0 while not tk.is_time_over(LIMIT): labels, stations, tour, sc = solve(N, M, ALPHA, points) if sc > best_sc: best_sc = sc best_labels, best_stations, best_tour = labels, stations, tour loop += 1 # ステーション微調整 best_stations, best_tour, best_sc = refine_stations( best_labels, points, best_stations, ALPHA ) # 出力 print('SC', best_sc, file=sys.stderr) for x,y in best_stations: print(x, y) print(len(best_tour)) for t,i in best_tour: print(t, i) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Debug mode') parser.add_argument('--debug', action='store_true', help='Enable debug mode') args = parser.parse_args() main(args.debug)