P8817 [CSP-S 2022] 假期计划
思路
-
因为所有边的边权都是
,所以考虑用 Bfs 求全源最短路 -
到 的距离都 $ \le k+1 B,C A,D \le k+1 $ -
枚举
,再根据枚到的 ,枚举符合条件的 $ A,D B,C $ 是等价的) -
因为对于每一个
,符合条件的 很多,取 的复杂度是 $ n^4 A,D $ 只保留最大的 个即可
代码
#include <bits/stdc++.h> #define int long long using namespace std; const int INF=1e9; int n,m,k; int w[2501],x,y; int dis[2501][2501],maxi; bool vis[2501]; queue <int> q; vector <int> v[2501]; set <pair<int,int>> s[2501]; void Bfs(int st){ memset(vis,0,sizeof(vis)); memset(dis[st],0x3f,sizeof(dis[st])); dis[st][st]=0; q.push(st); while(!q.empty()){ int top=q.front(); q.pop(); if(vis[top]) continue; else vis[top]=1; for(auto i:v[top]){ if(dis[st][i]>dis[st][top]+1){ dis[st][i]=dis[st][top]+1; q.push(i); } } } } signed main(){ // freopen("1.in","r",stdin); cin>>n>>m>>k; for(int i=2;i<=n;i++) cin>>w[i]; for(int i=1;i<=m;i++){ cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } for(int i=1;i<=n;i++) Bfs(i); for(int i=2;i<=n;i++){ //枚举B,C for(int j=2;j<=n;j++){ //枚举A,D if(i==j) continue; if(dis[i][j]<=k+1 && dis[1][j]<=k+1) s[i].insert({w[j],j}); if(s[i].size()>5) s[i].erase(s[i].begin()); } } for(int i=2;i<=n;i++){ //枚举B for(int j=2;j<=n;j++){ //枚举C if(i==j || dis[i][j]>k+1) continue; for(auto p:s[i]){ //枚举A if(p.second==i || p.second==j) continue; for(auto q:s[j]){ //枚举D if(q.second==i || q.second==j || q.second==p.second) continue; maxi=max(maxi,w[i]+w[j]+p.first+q.first); } } } } cout<<maxi<<"\n"; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)