在众多中小学生中,一款名为 아이싱 的在线一对一对战游戏正在流行。游戏公司在此基础上进行了扩展,开发了支持团队对战的 아이싱 II,可以让 Team I 和 Team Sing 之间进行对战。
아이싱 II 的设计利用了玩家在原有 아이싱 中的一对一对战历史,以一种独特的方式来组建队伍。也就是说,在 아이싱 中进行过一对一对战的两名玩家,必须被分到不同的队伍中。每个队伍的人数至少为 1 人,两个队伍的人数可以不同。
然而,距离 아이싱 II 服务器开启只剩 3 分钟时,却发现了一个致命问题。例如,如果玩家 A、B、C 之间两两都进行过对战,那么他们必须分别进入不同的队伍,从而无法只用 Team I 和 Team Sing 这两个队伍来完成分组。
为了解决这个问题,打算采用如下方法:删除最少数量的对战记录。但是,由于距离游戏上线只剩 3 分钟,可删除的对战记录数量最多只能是 2 条。如果必须删除 3 条或更多的记录,那么推迟上线可能反而更好。
在这种情况下,公司代表好奇的是:在能够构成两支队伍的前提下,最小删除规模的对战记录集合一共有多少种不同的选择方式。 也就是说,当最少需要删除的对战记录数量为 $K$ 时,需要计算大小为 $K$ 的、可删除的对战记录子集的个数。
你需要根据给定的 아이싱 对战记录,实现下面的函数,用来计算在可以构成两支队伍的前提下,选择最少数量对战记录进行删除的不同方法数。 删除对战记录的顺序不重要。
另外,如果即使删除不超过 2 条对战记录也无法进行游戏,则返回 0。 如果根本不需要删除任何记录,那么“不删除任何记录”是最快且唯一的方法,因此方法数为 1。
函数说明
long long count_ways( int N, vector<int> U, vector<int> V );
其中,$N$ 为玩家人数,$U$ 和 $V$ 为大小为 $M$ 的向量,表示在玩家 $U_i$ 与玩家 $V_i$ 之间存在一条 아이싱 对战记录。 函数需要返回在满足条件的情况下,删除最少数量对战记录的不同方法数。如果必须删除 3 条或以上记录,则返回 0。
实现细节
你必须提交一个名为 ising.cpp 的文件,其中实现如下函数:
long long count_ways( int N, vector<int> U, vector<int> V );
该函数应按照上述说明正确运行。当然,你可以自行定义并使用其他辅助函数。 提交的代码不得进行输入输出操作,也不得访问其他文件。
Grader 说明
给定的 grader 会按照如下格式读取输入:
- 第 1 行:$N\ M$ ($N$:玩家人数,$M$:아이싱 对战记录数量)
- 第 $2+i$ 行($0 \le i \le M-1$):$U_i\ V_i$ (表示玩家 $U_i$ 与玩家 $V_i$ 之间的一条 아이싱 对战记录)
grader 会输出你在 count_ways() 函数中返回的结果。
限制
- $3 \le N \le 250,000$
- $N-1 \le M \le 250,000$
- $1 \le U_i, V_i \le N$($0 \le i \le M-1$)
- $U_i \ne V_i$
- 若 $U_i = U_j$ 且 $V_i = V_j$,则 $i = j$ (不存在 $U_i = V_j$ 且 $V_i = U_j$ 的情况)
- 任意两名玩家都通过对战记录相互连通 (可以是直接对战,或通过其他玩家的对战关系间接连通)
子任务
- 子任务 1 [10 分]:$N \le 200,\ M \le 200$
- 子任务 2 [23 分]:$N \le 5,000,\ M \le 5,000$
- 子任务 3 [11 分]:$N \le 500$
- 子任务 4 [25 分]:$N \le 5,000$
- 子任务 5 [31 分]:$M - N \le 200$
- 子任务 6 [50 分]:无额外限制
样例数据
输入样例 1
4 4 1 2 1 3 2 4 3 4
输出样例 1
1
函数调用及结果如下:
count_ways(4, {1, 1, 2, 3}, {2, 3, 4, 4}) = 1输入样例 2
4 4 1 2 1 3 1 4 2 3
输出样例 2
3
输入样例 3
4 6 1 2 1 3 1 4 2 3 2 4 3 4
输出样例 3
3
输入样例 4
5 10 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5
输出样例 4
0
输入样例 5
12 16 1 2 2 3 3 4 4 1 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 5 1 5 2 7 3 9 4 11
输出样例 5
2