题解 LGP8817【[CSP-S 2022] 假期计划】
posted on 2022-10-29 23:32:15 | under 题解 | source
problem
solution
以每个点为源点跑 bfs,求出
我们弱化一下这个问题:如果只有两个景点
我们可以预处理一个
现在我们有三个景点
现在我们有四个景点
现在回到
code
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
template<int N,int M,class T=int> struct graph{
int head[N+10],nxt[M*2+10],cnt;
struct edge{
int u,v; T w;
edge(int u=0,int v=0,T w=0):u(u),v(v),w(w){}
} e[M*2+10];
graph(){memset(head,cnt=0,sizeof head);}
edge& operator[](int i){return e[i];}
void add(int u,int v,T w=0){e[++cnt]=edge(u,v,w),nxt[cnt]=head[u],head[u]=cnt;}
void link(int u,int v,T w=0){add(u,v,w),add(v,u,w);}
};
LL a[3010];
bool cmp(int i,int j){return a[i]>=a[j];}
struct node{
int v[4];
node(){v[0]=v[1]=v[2]=v[3]=0;}
void update(int k){
if(cmp(k,v[0])) v[3]=v[2],v[2]=v[1],v[1]=v[0],v[0]=k;
else if(cmp(k,v[1])) v[3]=v[2],v[2]=v[1],v[1]=k;
else if(cmp(k,v[2])) v[3]=v[2],v[2]=k;
else if(cmp(k,v[3])) v[3]=k;
}
int operator[](int i){return v[i];}
};
int n,m,sshwy,dis[3010];
bool to[3010][3010];
graph<3010,10010> g;
void bfs(int s){
queue<int> q;
memset(dis,0x3f,sizeof dis);
for(q.push(s),dis[s]=0;!q.empty();){
int u=q.front(); q.pop();
if(dis[u]>sshwy+1) continue;
to[s][u]=1;
if(dis[u]==sshwy+1) continue;
for(int i=g.head[u];i;i=g.nxt[i]){
int v=g[i].v;
if(dis[v]>dis[u]+1) dis[v]=dis[u]+1,q.push(v);
}
}
}
node f[3010];
void dp(){
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||!to[1][i]||!to[i][j]) continue;
f[j].update(i);
}
}
// for(int i=1;i<=n;i++){
// fprintf(stderr,"f[%d]={%d,%d,%d,%d}\n",i,f[i][0],f[i][1],f[i][2],f[i][3]);
// }
}
LL solve(){
LL res=-1;
for(int u=2;u<=n;u++){
for(int v=2;v<=n;v++){
if(!to[u][v]) continue;
node &be=f[u],&ce=f[v];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(!be[i]||!ce[j]) continue;
int pos[]={u,v,be[i],ce[j]};
if(sort(pos,pos+4),unique(pos,pos+4)==pos+4){
res=max(res,a[u]+a[v]+a[be[i]]+a[ce[j]]);
break;//后面的决策不会更优
}
}
}
//考场并没有发现只需要 3 个值,写的比较暴力
}
}
return res;
}
int main(){
a[0]=a[1]=-1e18;
freopen("holiday.in","r",stdin),freopen("holiday.out","w",stdout);
scanf("%d%d%d",&n,&m,&sshwy);
for(int i=2;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),g.link(u,v);
for(int i=1;i<=n;i++) bfs(i);
dp();
printf("%lld\n",solve());
return 0;
}
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/solution-P8817.html
分类:
solution
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】