#1068. 1-08G. JM的最短路径问题

内存限制:512 MiB 时间限制:750 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: JM233333

题目描述

JM今天懒得编题面了,于是他直接把题意赤裸裸地甩了出来:

给定一个 nn 个点、 mm 条边的无向连通图,节点编号为 1,2,...,n1, 2, ..., n ,边的编号为 1,2,...,m1, 2, ..., m ,每条边的长度均为 11

dist(u, v)dist(u,\ v) 表示图上从节点 uu 到节点 vv 的最短路径长度。要求在这 mm 条边中选择恰好 n1n-1 条边,将其余边全部删除,使得 sum=i=1ndist(1, i)sum = \sum_{i = 1}^{n}{dist(1,\ i)} 的值最小。

现在,你需要求出使得 sumsum 最小的选边方案有多少种,并输出所有的合法方案。输出格式为 b1b2...bmb_1b_2...b_m ,其中 bi=1/0b_i = 1/0 表示编号为 ii 的边选或不选。输出时按照01串 bb 的字典序从大到小输出。具体可参考输出样例。

当然,在某些情况下,合法的方案数可能会非常大。因此另外给定一个正整数 kk ,若合法的方案数超过 kk 种,则你需要输出的合法方案数为 kk ,并且接下来只输出字典序前 kk 大的 kk 种合法方案。

输入格式

第一行三个正整数 n, m, kn,\ m,\ k ,其中 n, mn,\ m 分别表示图的点数和边数, kk 表示你需要输出的最大方案数。

接下来 mm 行,第 ii 行表示编号为 ii 的边,每行两个正整数 uuvv ,表示这条双向边所连接的两个节点的编号。

输入保证图是连通的。

输出格式

第一行一个正整数 xx ,表示使得 sumsum 最小的选边方案有多少种。如果方案数超过 kk ,则输出 kk 而不是实际的方案数,也就是说你需要输出 min(x, k)min(x,\ k)

接下来 min(x, k)min(x,\ k) 行,每行一个01串 b1b2...bmb_1b_2...b_m ,表示一种合法的方案。输出时按照01串 bb 的字典序从大到小输出。若合法的方案数超过 kk 种,则只输出字典序前 kk 大的 kk 种合法方案。

样例

样例输入1

3 2 1000
1 2
1 3

样例输出1

1
11

样例输入2

3 3 1000
1 2
2 3
3 1

样例输出2

1
101

样例输入3

5 6 1000
1 2
1 3
2 4
2 5
3 4
3 5

样例输出3

4
111100
111001
110110
110011

数据范围与提示

2n21052 \le n \le 2 \cdot 10^5

n1m2105n-1 \le m \le 2 \cdot 10^5

1k21051 \le k \le 2 \cdot 10^5

mk106m \cdot k \le 10^6

Hint

本题输出量较大,请使用scanf/printf以免I/O时间过长导致TLE。