P2196 [NOIP1996 提高组] 挖地雷 题解
分析
,放心 dfs。难点主要在保存路径上。
一个点的地雷只能挖一次,所以需要维护 数组。
注意,任何点都可以作为起点。
代码
#include <bits/stdc++.h> using namespace std; int n; int a[25]; vector <int> g[25]; vector <int> path;//答案路径 vector <int> cur;//搜索时的临时路径 bool vis[25]; int ans; bool flag; void dfs(int x, int sum) {//x 为当前地窖,sum 为已挖到的地雷数 for (int i = 0; i < g[x].size(); i++) { if (!vis[g[x][i]]) { vis[g[x][i]] = true; cur.push_back(g[x][i]); dfs(g[x][i], sum + a[g[x][i]]); vis[g[x][i]] = false; cur.pop_back(); } } //注意更新答案要在回溯之后 if (sum > ans) { ans = sum; path.clear(); path = cur; flag = true; } } int main() { cin >> n; for (int i = 1; i <= n; i++)cin >> a[i]; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { int b; cin >> b; if (b)g[i].push_back(j);//可以到达,连边 } } int root = 0;//起点 for (int i = 1; i <= n; i++) { memset(vis, 0, sizeof vis); flag = false; dfs(i, a[i]); if (flag)root = i;//如果更新了答案,更新起点 } cout << root; for (auto i = path.begin(); i != path.end(); i++) { cout << ' ' << *i; } cout << endl << ans; return 0; }
本文作者:tmjyh09
本文链接:https://www.cnblogs.com/tmjyh09/p/15757723.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步