From 66f957900fa8e0c8bad82265f37fbad4c838dad2 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Thu, 25 Sep 2025 15:43:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(P8817):=20=E9=87=8D=E6=9E=84=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E8=A7=A3=E6=B3=95=E5=B9=B6=E4=BC=98=E5=8C=96=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原递归实现改为BFS算法计算节点间距离 使用预处理和剪枝优化计算效率 添加完整解题逻辑计算最大得分 --- src/8/15/P8817.cpp | 59 --------------------------- src/9/25/P8817.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 59 deletions(-) delete mode 100644 src/8/15/P8817.cpp create mode 100644 src/9/25/P8817.cpp diff --git a/src/8/15/P8817.cpp b/src/8/15/P8817.cpp deleted file mode 100644 index da85b69..0000000 --- a/src/8/15/P8817.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include -#include -#include -#include - -using ll = int64_t; -ll n,m,k; -std::vector score; -std::vector> edg; -std::vector> cango; -std::vector> best3; - -void dfscango(ll from,ll cur, ll curk){ - if(curk>k){ - return; - } - for(ll i=0;i>n>>m>>k; - score.resize(n+1); - edg.resize(n+1); - cango.resize(n+1,std::vector(n+1)); - best3.resize(n+1); - for(ll i=2;i<=n;i++){ - std::cin>>score[i]; - } - for(ll i=1;i<=m;i++){ - ll u,v; - std::cin>>u>>v; - edg[u].push_back(v); - edg[v].push_back(u); - } - for(ll i=1;i<=n;i++){ - dfscango(i, i, 0); - } - for(ll i=2;i<=n;i++){ - std::priority_queue,std::vector>,std::greater<>> pr; - for(ll j=2;j<=n;j++){ - if(i==j)continue; - if(cango[i][j]&&cango[j][1]){ - pr.emplace(score[j],j); - } - } - //TODO - } - for(ll B=2;B<=n;B++){ - for(ll C=B+1;C<=n;C++){ - - } - } -} \ No newline at end of file diff --git a/src/9/25/P8817.cpp b/src/9/25/P8817.cpp new file mode 100644 index 0000000..c556e48 --- /dev/null +++ b/src/9/25/P8817.cpp @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +using ll = long long; + +const int MAXN = 2505; + +int n; +int m; +int k; +ll sc[MAXN]; + +std::vector adj[MAXN]; +int dist[MAXN][MAXN]; + +std::vector pre[MAXN]; + +void bfs(int s) { + std::queue> q; + q.push({s, 0}); + dist[s][s] = 0; + + while (!q.empty()) { + auto [u, d] = q.front(); + q.pop(); + if (d > k) { + continue; + } + for (int v : adj[u]) { + if (dist[s][v] == -1) { + dist[s][v] = d + 1; + q.push({v, d + 1}); + } + } + } +} + +int main() { + std::ios_base::sync_with_stdio(false); + std::cin.tie(nullptr); + + std::cin >> n >> m >> k; + + for (int i = 2; i <= n; ++i) { + std::cin >> sc[i]; + } + + for (int i = 0; i < m; ++i) { + int u, v; + std::cin >> u >> v; + adj[u].push_back(v); + adj[v].push_back(u); + } + + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= n; ++j) { + dist[i][j] = -1; + } + } + + for (int i = 1; i <= n; ++i) { + bfs(i); + } + + for (int i = 2; i <= n; ++i) { + for (int j = 2; j <= n; ++j) { + if (i == j) + continue; + if (dist[1][j] != -1 && dist[j][i] != -1) { + pre[i].push_back(j); + } + } + std::sort(pre[i].begin(), pre[i].end(), [&](int a, int b) { return sc[a] > sc[b]; }); + if (pre[i].size() > 3) { + pre[i].resize(3); + } + } + + ll ans = 0; + for (int b = 2; b <= n; ++b) { + for (int c = 2; c <= n; ++c) { + if (b == c) + continue; + if (dist[b][c] != -1) { + for (int a : pre[b]) { + for (int d : pre[c]) { + if (a != c && a != d && b != d) { + ans = std::max(ans, sc[a] + sc[b] + sc[c] + sc[d]); + } + } + } + } + } + } + + std::cout << ans << std::endl; +}