【题解】Network
Solution to Question Ⅰ
首先缩点(当然也可以不缩?),然后跑一遍 DFS 即可。
//w为联通分量里的节点个数
inline void dfs (const int &u) {
ans1[u] = w[u];
for (int v : G_scc[u])
dfs(v), ans1[u] += ans1[v];
}
Solution to Question Ⅱ
观察缩完点后的图一定是保证无环的,又由于题目有个非常特殊的条件:图中有一个中心点
对于节点
注意这里的到达是指有且仅有一条路径,考虑下图情况:如果我们想从
但是对于如下图「特例」,向上连的边,仅是“擦边”经过联通分量。此时这条边是可连的。
对于节点
-
所有节点都连接到
,再由 连一条边向上。 -
有且 仅有一条 边直接跳过
,直接向上连边,且满足「特例」(见上)。「仅有一条」:因为如果有第二条边向上连,则会有两个环经过同一条路径(
往上)。
实现
由于缩完点是一棵树,考虑用
建图时,加上:
edge[scc[v]] = make_pair(u, v),
这样我们可以在
edge[B].second == edge[C].first
Summary
- 这道题需要考虑很多情况;
- 实现起来也还是有点难度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现