#P2076. All Roads Lead to Albuquerque, er, Rome

All Roads Lead to Albuquerque, er, Rome

描述

我的一个朋友有一种独特的在城市中驾驶的方法,他说这有助于减少他必须记住的路线数量,以免迷路。他选择两个地点作为枢纽(H1H1H2H2),将所有其他地点分配到H1H1H2H2,然后学习从所有地点到其关联枢纽的最短路径。如果他想从AABB,他会从AAAA关联的枢纽,然后到BB关联的枢纽(如果BB关联的枢纽与AA不同),再到BB。我的朋友总是会经过枢纽,即使这意味着他会多次访问目的地。

你的程序需要分析一个城市(一组节点和边长度),并选择最佳的枢纽对和节点分配方案。最佳配置是使所有节点对之间的平均旅行距离最小的配置。如果有多个配置得到相同的最低平均值,你的程序可以输出其中任何一个。

输入

输入包含多个测试用例。第一行是一个整数,表示测试用例的数量。

每个测试用例的第一行是: nn mm 其中 22 <= nn <= 10010011 <= mm <= 10001000nn 是城市中的地点数量,mm 是直接连接两个地点的道路段数量。可能存在多条道路连接同一对地点,也可能有道路的起点和终点是同一地点。

接下来的 mm 行描述道路段,每行包含三个整数: aa bb dd

其中 11 <= aa <= nn11 <= bb <= nn11 <= dd <= 10001000aabb 是道路段的两个端点,dd 是从 aabb(或 bbaa)的距离。所有道路都是双向的。

任意两个地点之间都存在路径。

输出

对于每个测试用例,输出一个最佳的枢纽选择和地点分配方案。输出一行包含 nn 个整数,用空格分隔。如果第 ii 个地点是枢纽,第 ii 个整数为 00;否则,第 ii 个整数为该地点的枢纽编号(11nn 之间)。

提示 输出字典序最小的序列。(例如,对于第一个测试用例,22 00 00 也是有效的,但 00 00 2222 00 00 小。)

选择H1H1H2H2中编号较小的枢纽。

如果仍有多个解,输出字典序最小的序列。

输入数据 1

3
3 2
1 2 40
2 3 20
7 10
1 1 1
1 2 2
2 4 2
4 3 2
3 1 2
2 3 5
3 7 10
7 6 1
5 6 1
4 5 1
16 15
1 8 1
2 8 1
3 8 1
4 9 1
5 9 1
6 9 1
7 8 1
8 9 3
9 10 1
8 11 1
8 12 1
8 13 1
9 14 1
9 15 1
9 16 1

输出数据 1

0 0 2
4 4 4 0 0 5 5
8 8 8 9 9 9 8 0 0 9 8 8 8 9 9 9

来源

Mid-Atlantic 2004