题解 P8817 [CSP-S 2022] 假期计划
有趣的T1
Solution
首先看到 的限制,考虑怎么转化成 的情况:跑一遍全源最短路得到距离,再把距离 的点重新连边即可。由于边权均为 ,可以直接跑 轮 , 的复杂度可以接受。
然后我们只要在重新连边的新图上找到最大的长度为 的回路就能解决。若直接搜索,复杂度为 ,但是考虑到前两个景点和后两个景点是本质相同的,我们可以只枚举前两个点(后两个点也一样),结果记录在第二个点,即 上,然后枚举中间的 (代表前两个点)和 (代表后两个点)两点并合并答案。
但是这四个景点要求互不相同,而前两个点和后两个点的最优解有可能有重复的点,我们就可以不考虑最优解,而是存下前三优解(即最优解,次优解和次次优解),这样的好处是:枚举 时,若前两个点的最优解和次优解的 点或 点都和 或 重复,就可以选择次次优解与之更新答案。枚举复杂度为 。
最后,一定要开 !我有个朋友因为一个地方没开而造成ub,。
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
namespace io{
char buf[1<<21],*p1=buf,*p2=buf;
inline char gc(){return p1==p2&&(p2=(p1=buf)+cin.rdbuf()->sgetn(buf,1<<21),p1==p2)?EOF:*p1++;}
template<typename T>inline void read(T&x){
x=0;char f=0,c=gc();
while(!isdigit(c))f|=(c=='-'),c=gc();
while(isdigit(c))x=x*10+c-'0',c=gc();
if(f)x=-x;
}
}using namespace io;
const int N=2505,M=1e4+5;
int n,m,k,dis[N][N];
ll ans,s[N];
forward_list<int>G[N],H[N];
bool vis[N];
priority_queue<pair<int,int>>q;
void dij(int S){
while(!q.empty())q.pop();
memset(vis,0,sizeof(vis));
q.emplace(0,S);dis[S][S]=0;
while(!q.empty()){
int u=q.top().second;q.pop();
vis[u]=1;
for(int v:G[u]){
if(dis[S][v]>dis[S][u]+1){
dis[S][v]=dis[S][u]+1;
if(!vis[v])q.emplace(-dis[S][v],v);
}
}
}
for(int i=1;i<=n;i++)
if(i!=S&&dis[S][i]<=k+1)
H[S].push_front(i);//重新连边,只连单向是因为跑i点的dij时也会向S连边
}
set<pair<ll,int>>f[N],g[N];
int main(){
read(n),read(m),read(k);
for(int i=2;i<=n;i++)read(s[i]);
for(int i=1,u,v;i<=m;i++){
read(u),read(v);
G[u].push_front(v);
G[v].push_front(u);
}memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)dij(i);
for(int u:H[1])for(int v:H[u]){//枚举前两个点
f[v].emplace(s[u]+s[v],u);
if(f[v].size()>3)f[v].erase(f[v].begin());
}
for(int u=2;u<=n;u++)for(int v:H[u])
for(auto x:f[u])for(auto y:f[v])
if(x.second!=y.second&&x.second!=v&&y.second!=u)//判断景点不重复
ans=max(ans,x.first+y.first);
printf("%lld\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】