#P15170. [SWERC 2022] Train Splitting

[SWERC 2022] Train Splitting

说明

意大利有 nn 个大城市,城市之间有 mm 条火车线路。每条线路连接两个不同的城市,且是双向的。此外,利用这些火车线路,从任意一个城市出发都可以到达其他所有城市。

目前,所有线路都由国有的意大利客运公司运营,但政 府希望将这些线路私有化。政 府既不希望某家公司拥有过多权力,也不希望人们需要购买太多不同公司的订阅,同时还希望给所有公司公平的机会。为此,提出了如下模型:

将有 k2k \ge 2 家私营公司,编号为 1,2,,k1,\,2,\,\dots,\,k。每条火车线路将由 kk 家公司中的一家独立运营。要求:

  • 对于任意一家公司,存在两个城市,使得仅使用该公司运营的线路无法从一个城市到达另一个城市。
  • 另一方面,对于任意两家公司,使用这两家公司运营的线路,任意两个城市之间都可以互相到达。

请给出一种满足上述所有条件的分配方案。可以证明,总是存在可行方案。注意,你可以自行选择 kk 的值,并且不需要最小化或最大化 kk

输入格式

每个测试点包含多组测试数据。第一行包含一个整数 tt1t10001 \le t \le 1000),表示测试数据组数。接下来是 tt 组测试数据。

每组测试数据的第一行包含两个整数 nnmm3n503 \le n \le 50n1mn(n1)/2n-1 \le m \le n(n-1)/2),分别表示城市数和火车线路数。

接下来的 mm 行,每行包含两个整数 uiu_iviv_i1ui,vin1 \le u_i, v_i \le nuiviu_i \ne v_i),表示第 ii 条火车线路连接城市 uiu_iviv_i

保证每条线路连接的是不同的城市对,且所有线路连通整个城市集合,即任意两个城市之间都可以通过火车线路互达。

所有测试数据中 nn 的总和不超过 50005000

输出格式

对于每组测试数据,第一行输出一个整数 kk2km2 \le k \le m),表示你方案中的公司数;第二行输出 mm 个整数 c1,c2,,cmc_1,\,c_2,\,\dots,\,c_m1cik1 \le c_i \le k),表示在你的方案中,第 ii 条线路由公司 cic_i 运营。

如果有多种可行方案,你可以输出任意一种。

2
5 9
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
3 3
1 2
3 1
2 3
4
1 2 3 1 4 2 2 4 3
3
2 3 1

提示

在第一个测试点中,输出结果如下图所示,不同颜色代表不同公司(蓝色为 11,红色为 22,绿色为 33,黄色为 44):

:::align{center} :::

例如,仅考虑公司 2233 时,可以发现任意两个城市之间都可以互达(下图左)。但如果只考虑公司 22,则无法从城市 11 到达城市 55(下图右)。

:::align{center} :::

第二个测试点的输出结果如下图所示:

:::align{center} :::

由 ChatGPT 4.1 翻译