题目描述
这是一道提交答案题。
有 $n$ 个人,在他们之间组织了若干次聚会。一开始任意两个人都不是朋友。在每一次聚会中,参加的人两两都会成为朋友。现在你忘记了一共组织了多少次聚会,也忘记了每次聚会有谁参加,只知道最后有哪些人成为了朋友。你想要还原出聚会的过程。显然聚会的方案不是唯一的,你想要找出一种使得聚会次数尽量少的方案。次数越少,得分越高,具体评分方式见评分标准。
输入格式
所有输入数据 friends1.in ~ friends10.in
见下发文件,分别对应 $10$ 个测试数据。
每组数据中,第一行包含两个正整数 $n,m$ ,表示人数和朋友对数。
接下来 $m$ 行,每行包含两个数 $x,y$ ,表示 $x$ 和 $y$ 这两个人是朋友。
输出格式
输出到 friends1.out ~ friends10.out
。
第一行一个正整数 $k$ ,表示你的方案中聚会的次数。
接下来 $k$ 行,每行表示一次聚会。先输出一个数 $r$ ,表示这次聚会参加的人数。一行内紧接着包含 $r$ 个互不相同的正整数,表示这次聚会参加的人的集合。
你需要保证这 $k$ 个聚会组织后满足输入的 $m$ 对人是朋友,且剩下的人之间没有成为朋友。
你还需要保证 $k\leq m$ 且每次参加聚会的人数之和不超过 $2m$ 。
样例输入
4 5 1 2 1 3 2 3 2 4 3 4
样例输出
2 3 1 2 3 3 2 3 4
样例解释
一共有两次聚会。
第一次聚会中 $1,2,3$ 三个人参加,所以 $(1,2),(2,3),(1,3)$ 在聚会后成为了朋友。
第二次聚会中 $2,3,4$ 三个人参加,所以 $(2,3),(3,4),(2,4)$ 在聚会后成为了朋友。
在聚会完成后, $(1,2),(1,3),(2,3),(2,4),(3,4)$ 成为了朋友,和输入相符合。
容易证明 $k$ 的最小值就是 $2$ ,所以样例输出为这组样例的最优解(但存在 $k$ 更大的合法方案)。
数据范围
测试点标号 | $n=$ | $p=$ | 特殊性质 |
---|---|---|---|
1 | $6$ | $\frac 12$ | |
2 | $10$ | $\frac 12$ | |
3 | $50$ | 不存在 | A |
4 | $100$ | $\frac 13$ | |
5 | $100$ | $\frac 12$ | |
6 | $500$ | $\frac 15$ | |
7 | $500$ | $\frac 12$ | |
8 | $1000$ | $\frac 15$ | |
9 | $1000$ | $\frac 13$ | |
10 | $1000$ | $\frac 12$ |
特殊性质 A :可以把人分为两组,使得组内人与人之间都不是朋友。
如果 $p$ 有值,那么说明这一个测试点中,数据以如下方式生成:对于每两个人 $i,j(i < j)$ , $i$ 和 $j$ 有 $p$ 的概率是朋友,有 $1-p$ 的概率不是朋友。
评分标准
如果你的输出不符合题目要求,那么得分为 $0$ 。
如果你的输出是正确的,令 $Z$ 为你的方案中团的个数,对于这个测试点,你的得分以如下方式计算:
- 如果 $Z\leq Z_0$ ,得分为 $S$ 。
- 如果 $Z>Z_0$ ,得分为 $S\times (\frac {Z_0}{Z})^3$ 。
每个测试点的参数 $Z_0$ 和分数 $S$ 如下:
测试点标号 | $1$ | $2$ | $3$ | $4$ | $5$ | $6$ | $7$ | $8$ | $9$ | $10$ |
---|---|---|---|---|---|---|---|---|---|---|
$Z_0$ | $4$ | $9$ | $ 321$ | $288 $ | $208 $ | $3935 $ | $2621 $ | $12386$ | $ 11198 $ | $8486$ |
$S$ | $4$ | $8$ | $6$ | $9$ | $9$ | $11$ | $11$ | $13$ | $13$ | $16$ |
在有 friends1.in ~ friends10.in
的文件夹中,将你的答案存在 friends1.out ~ friends10.out
后,你可以用下发文件中的 checker.cpp
来得知自己每个测试点的当前得分。