using System; using System.Collections.Generic; using System.Linq; using System.Text; class Yukico5007 { static void Main(string[] args) { var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); var N = nums[0]; var M = nums[1]; var planets = new List<(int y, int x)>(); for (int i = 0; i < N; i++) { nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); planets.Add((nums[0], nums[1])); } var directCosts = new double[N * N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) continue; var cost = Math.Sqrt(Math.Abs(planets[i].y - planets[j].y) * Math.Abs(planets[i].y - planets[j].y) + Math.Abs(planets[i].x - planets[j].x) * Math.Abs(planets[i].x - planets[j].x)); directCosts[i * N + j] = cost; } } var inputs = new Inputs(directCosts, null); var solver = new Solver(); var command = solver.GetCommand(inputs); command.Print(); } } class Inputs { /// 他の惑星を経由せずに直接飛ぶコスト(αは考慮しない) public double[] DirectCosts; /// 他の惑星を経由して飛ぶ最小コスト(αは考慮しない) public double[] RouteCosts; public const int N = 100; public const int M = 8; public const int A = 5; public Inputs(double[] directCosts, double[] routeCosts) { DirectCosts = directCosts; RouteCosts = routeCosts; } } class Outputs { public List<(int y, int x)> Stations = new(); public List<(int t, int r)> Route = new(); public void Print() { foreach (var pos in Stations) { Console.WriteLine($"{pos.y} {pos.x}"); } Console.WriteLine(Route.Count); foreach (var via in Route) { Console.WriteLine($"{via.t} {via.r}"); } } } class Solver { public Outputs GetCommand(Inputs inputs) { var res = new Outputs(); for (int i = 0; i < Inputs.M; i++) { res.Stations.Add((0, 0)); } for (int i = 0; i < Inputs.N; i++) { res.Route.Add((1, i + 1)); } res.Route.Add((1, 1)); return res; } } public class TwoOpt { public readonly int NodeCount; public readonly int NodeCount2; public readonly int[] Costs; /// idx番目に経由する点がvalue番目の要素 public readonly int[] IdxByOrders; Random _random; System.Diagnostics.Stopwatch _sw; public TwoOpt(int n, int[] costs, int[] defaultOrder, Random random, System.Diagnostics.Stopwatch sw) { NodeCount = n; NodeCount2 = defaultOrder.Length; Costs = costs; IdxByOrders = new int[NodeCount2]; Array.Copy(defaultOrder, IdxByOrders, NodeCount2); _random = random; _sw = sw; } public void Exec() { var cnt = 0; var costsSpan = new Span(Costs); while (_sw.ElapsedMilliseconds < 900) { for (int i = 0; i < 100; i++) { // 先頭、末尾は交換しない var from1order = _random.Next(NodeCount2 - 4); var from2order = _random.Next(from1order + 3, NodeCount2); var from1 = IdxByOrders[from1order]; var from2 = IdxByOrders[from2order]; var to1 = IdxByOrders[from1order + 1]; var to2 = IdxByOrders[from2order - 1]; // コスト計算 var oldRouteCost = costsSpan[from1 * NodeCount + to1] + costsSpan[from2 * NodeCount + to2]; var newRouteCost = costsSpan[from1 * NodeCount + to2] + costsSpan[from2 * NodeCount + to1]; // 改善されていれば更新 if (newRouteCost < oldRouteCost) Swap(from1order, from2order); } cnt++; } } /// /// 2点の接続を交換する /// /// 点1のOrder順 /// 点2のOrder順 public void Swap(int from1order, int from2order) { Array.Reverse(IdxByOrders, from1order + 1, from2order - from1order - 1); } }