#HK4944. 「EGOI2022」社交工程

「EGOI2022」社交工程

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "socialengineering.h"

题目描述

题目译自 EGOI2022 Day1 T3. Social Engineering

一个社交网络可以用一个无向连通图表示,图中有 nn 个顶点和 mm 条边。每个顶点代表一个人,如果两个人之间有一条边,就说明他们是朋友。

玛丽亚是这个社交网络中的一员,她喜欢挑战她的朋友们去做各种事情。她会先完成一个简单的任务,然后挑一个朋友去做同样的事。被挑战的朋友会再挑自己的一个朋友,以此类推,挑战就这样传下去。同一个人可能会被多次挑战,但每对朋友(无序的两人组合)只能参与挑战一次。也就是说,一旦 AA 挑战了 BBAABB 就不能再次相互挑战。用图的术语来说,这些挑战形成了一条路径,且每条边最多只会被经过一次。

如果轮到某人挑战时,他没有可以挑战的朋友,他就输了。挑战总是由玛丽亚开始,她很少会输。现在,网络中剩下的 n1n-1 个人决定联手,让玛丽亚在下一次挑战中失败,而你的任务就是协调他们的努力。

交互方式

你需要实现一个函数:

void SocialEngineering(int n, int m, vector<pair<int,int>> edges);

这个函数会在一个有 nn 个顶点和 mm 条边的图上进行游戏。评测程序会调用这个函数一次。参数 edges 是一个包含 mm 个整数对 (u,v)(u, v) 的列表,表示顶点 uuvv 之间有一条边。顶点的编号从 11nn,玛丽亚始终是编号为 11 的顶点。你的函数可以调用以下两个函数:

int GetMove();

当轮到玛丽亚行动时(比如游戏刚开始时),你应该调用这个函数。如果在不是玛丽亚的回合调用它,你会得到「Wrong Answer」的评测结果。这个函数可能返回以下值之一:

  • 一个整数 vv (2vn)(2 \leq v \leq n),表示玛丽亚挑战编号为 vv 的人。这个移动总是合法的。
  • 00,表示玛丽亚放弃游戏。如果玛丽亚没有合法的移动,她会放弃。这时,你的程序应该让 SocialEngineering 函数返回,你会得到「Accepted」的评测结果。
void MakeMove(int v);

当轮到其他人行动时,你需要调用这个函数,表示当前回合的人挑战编号为 vv 的人。如果这个移动不合法,或者调用时是玛丽亚的回合,你会得到「Wrong Answer」的评测结果。

如果游戏开始时玛丽亚有必胜策略,你的程序应该在第一次调用 GetMove() 之前让 SocialEngineering 返回,你会得到「Accepted」的评测结果。

示例评测程序

任务附件 SocialEngineering.zip 中提供了样例评测程序 grader.cpp,它从标准输入读取以下格式的输入:

  • 第一行包含图的顶点数 nn 和边数 mm
  • 接下来的 mm 行,每行包含两个整数 uuvv,表示 uuvv 之间有一条边

样例评测程序会读取输入并调用你实现的 SocialEngineering 函数。注意,样例评测程序并未实现玛丽亚的必胜策略,仅用于演示交互过程。

要将你的解决方案与样例评测程序一起编译,可以在终端输入以下命令:

g++ -std=gnu++11 -O2 -o solution grader.cpp solution.cpp

其中 solution.cpp 是你要提交到 CMS 的解决方案文件。要用附件中的样例输入运行程序,请在终端输入:

./solution < input.txt

样例 1

程序调用 交互器调用 说明
- SocialEngineering(5, 6, {{1,4}, {1,5}, {2,4}, {2,5}, {2,3}, {3,5}}) 调用函数,图有 55 个顶点和 66 条边
GetMove() 返回 44 玛丽亚挑战 44
MakeMove(2) - 44 号挑战 22
MakeMove(5) 22 号挑战 55
MakeMove(1) 55 号挑战玛丽亚
GetMove() 返回 00 玛丽亚无合法移动,放弃
Returns - 你赢了,函数应返回

样例 2

程序调用 交互器调用 说明
- SocialEngineering(2, 1, {{1,2}}) 调用函数,图有 22 个顶点和 11 条边
Returns - 玛丽亚有必胜策略,你应直接返回放弃

数据范围与提示

对于所有输入数据,满足:

  • 2n21052 \leq n \leq 2 \cdot 10^{5}
  • 1m41051 \leq m \leq 4 \cdot 10^{5}
  • 图是连通的。每对顶点(无序)最多只出现一次作为一条边,每条边连接的都是不同的顶点。

玛丽亚总是以最佳策略行动:只要有必胜策略,她就会赢。如果没有必胜策略,她会用各种巧妙的方式诱导你的程序出错。她只有在没有合法移动时才会放弃(子任务 3 除外)。

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 1515 n,m10n, m \leq 10
22 1515 除了玛丽亚外,每个人的朋友数量不超过 22
33 2020 除非玛丽亚有必胜策略,否则她会立刻放弃
44 2525 n,m100n, m \leq 100
55 2525 无附加限制