1. 题目背景与核心逻辑解析
UVa 11981 "Corrupted Friendship"是一道考察图论和深度优先搜索(DFS)应用的经典算法题。题目描述了一个特殊的邀请卡分发过程,我们需要通过分析这个过程的规则来推导出两个关键指标:总邀请次数和确定不是朋友的人对数。
1.1 题目规则拆解
初始状态下,Mr. Haba拥有N张邀请卡(编号1到N对应N个人)。分发过程遵循以下核心规则:
- 保留与传递机制:当X拥有卡片时,他会保留一张卡片,然后选择一个未被邀请的朋友Y,将剩余所有卡片交给Y
- 递归邀请:Y收到卡片后,会重复相同的过程 - 保留一张,邀请自己的朋友
- 返还机制:当Y无法继续邀请时,将剩余卡片返还给X
- 终止条件:当所有人都获得卡片时过程结束
这个规则实际上定义了一个树形结构的构建过程,其中:
- 每个"邀请"动作对应树中的一条有向边
- 最终形成的是一棵以Mr. Haba(节点1)为根的生成树
1.2 关键观察与简化
通过仔细分析题目描述,我们可以得出几个重要观察:
- 唯一父节点原则:每个人(除根节点外)有且只有一个邀请者,这意味着输入数据实际上定义了一棵树
- DFS遍历特性:邀请过程天然符合DFS的遍历顺序 - 深入优先,回溯时返还卡片
- 隐含假设:题目暗示了邀请顺序是固定的(即按照输入边的顺序),这使得问题具有确定性解
注意:如果没有固定顺序的假设,问题将变得极其复杂,需要考虑所有可能的排列组合。这是竞赛题目常见的简化手段。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题求解思路详解
2.1 总邀请次数的计算
这部分相对简单直接:
- 初始有N张卡片,最终每人保留1张
- 除根节点外,每个人都需要被邀请一次才能获得卡片
- 因此总邀请次数必定是N-1
这个结论不需要复杂计算,属于题目给出的直接推论。
2.2 确定非朋友对数的计算
这是本题的核心难点,需要深入理解DFS遍历过程中的状态变化。
2.2.1 朋友关系的定义
在本题上下文中:
- 如果X邀请了Y(即存在边X→Y),则X和Y必定是朋友
- 反过来不成立 - 没有直接邀请关系的人可能仍然是朋友
2.2.2 非朋友关系的判定条件
关键观察:在D
