题目大意
一组多米诺骨牌,将用手推倒若干个,被推倒的多米诺骨牌可让后面的多米诺骨牌倒下,问有几个多米诺骨牌被推倒。
题目分析
可将多米诺骨牌视为一个有向图,要模拟推倒的过程,可用深度优先遍历方法。
考虑使用邻接表储存图,首先读入要存的边 ,随后将边存入 vector
里:
1 | adj[u].push_back(v); |
随后读入起始点 ,以 为起点,对图进行 DFS 操作。
1 | cin >> z; |
然后将 DFS 函数补充完整。
1 | void dfs(int u) |
最后,统计被访问过的点的个数,并输出。
1 | for(int i = 1; i <= n; i++) ans += vis[i]; |
注意:因为有多组数据,所以应在每组数据处理之前清空邻接表以及标记数组。
完整代码
1 |
|
题外话
这是本蒟蒻第一篇图论题题解。
本蒟蒻做此题时吃了 发 WA:
- https://www.luogu.com.cn/record/118107739
- https://www.luogu.com.cn/record/118114629
- https://www.luogu.com.cn/record/118116460
- https://www.luogu.com.cn/record/118118074
- https://www.luogu.com.cn/record/118119867
- https://www.luogu.com.cn/record/118121676
- https://www.luogu.com.cn/record/118127408
- https://www.luogu.com.cn/record/118127974
- https://www.luogu.com.cn/record/118129710
在第十次终于 AC 了:https://www.luogu.com.cn/record/118131412